示例页面

Numpy 数组

shape:查看数组的维度 shape(12,)代表一维12列数组

reshape((m,n)) :修改数组的维度

flatten() :将多维数组展平为一维数组

arange([start,] stop[, step,], dtype=None) :返回等差序列

np.zeros(shape, dtype = float, order = 'C'):创建元素均为0的数组

np.ones(shape, dtype, order = 'C'):创建元素均为1的数组

np.asarray():将一个python序列转化为ndarray对象。

数组基本属性

  • array.shape
  • array.shape = (3,2)
  • array.reshape((2,3))
  • array.ndim
  • array.dtype
  • array.size
  • array.itemsize
# 数组基本属性
import numpy as np
array = np.array([[1,2,3],
                 [4,5,6]],dtype=np.float)       # dtype设置数据类型,默认64位,float32为32位
a = np.array([1,23,4,'lj','rz'])                # 不同数据类型会转换成同一类型 
print('打印矩阵array:\n',array)
print('array的数据类型:',array.dtype)
print('number of dim:',array.ndim)             # ndim 维度(轴)个数
print('shape:',array.shape)                    # shape 数组的维度
print('size:',array.size)                      # size 数组包含数据的个数,即维度的乘积
print('更改数组array维度:\n',array.reshape((3,2))) # reshape 更改数组维度
print('数组a:',a,'\n数组a数据类型:',a.dtype,'\n数组a类型',type(a),'\n数组a每个元素字节大小:',a.itemsize)

数组索引、切片

# 数组索引,切片
import numpy as np 
array = np.arange(12).reshape(3,4)
print('打印原数组:\n',array)
print('第2行3列数据:',array[1][2],array[1,2]) # 索引从0开始,使用方法同R
# 极值索引位置
print('最大值索引位置:',array.argmax())
print('最小值索引位置:',array.argmin())
print('第一行中最大值索引位置:',array[1].argmax())
print('第三列中最小索引位置:',array[:,2].argmax()) # 数组只取其中某列表示方式[:,col]

数组改增删、赋值

# 修改数组
import numpy as np 
a = np.arange(0, 30,2).reshape(5,3)                       # 创建步长为2的5行3列数组
b = a                                                     # 数组赋值,一个变,另一个也变
c = a.copy()                                              # 数组c不受a变化影响
a[0:2,1]=11                                               # 第1行,2行,第2列数据更改成8
print('修改后数组a:\n',a)
print('变化后数组b:\n',b)
print('数组c:\n',c)

# 删 np.delete(对象,index,[axis])
d = np.delete(a,[2,3,4])                                   # 删除索引位置是2、3、4的数据,返回一维数组
print('删除后数组d:\n',d)
print('删除索引位置1的数据:',np.delete(a,1))                # 删除索引位置是1的数据,返回一维数组
print('删除索引为1所在的行:\n',np.delete(c,1,axis=0))       # 删除下标为1这一行
print('删除索引为1和2所在列:\n',np.delete(c,[1,2],axis=1))  # 删除下标为1和2的这两列

# 插入 np.insert(对象,index,插入数据,[axis])
print('数组c\n',c)
e = np.insert(c,2,100)                                     # 在索引位置2之前插入数据100,返回一维数组
print('数组e[在索引位置2之前插入数据]:',e)
e1 = np.insert(c,3,[100,222,333],axis = 0) # 在第3行前插入一维数组
print('数组e1[在第3行前插入一维数组]:\n',e1)
print('数组c追加一行:\n',np.append(c,[[101,202,303]],axis=0)) # np.append()注意要添加数组的维度
print('数组c追加一行:\n',np.append(c,[101,202,303],axis=0))   # 会报错


数组运算

import numpy as np 
# 数组运算
a = np.array( [20,30,40,50] )
b = np.arange( 4 )
c = a-b # 逐个元素加减
d = a+b 
e = b**2 # 逐个元素平方
print('the result of a-b  :',c)
print('the result of a+b :',d)
print('the result of b**2 :',e)
print('the result of sin(a) :',np.sin(a))
a < 45  # 返回布尔值 array([ True,  True,  True, False])

# 矩阵运算
A = np.array( [[1,1]
                     ,[0,1]] )
B = np.array( [[2,0],
                       [3,4]] )
print('A*B:\n',A*B)  # 逐个对应元素相乘
print('A@B:\n',A.dot(B)) # 矩阵乘法,也可写成A@B
print('A的转置矩阵A.T:\n',A.T,'\n或者np.transpose\n',np.transpose(A)) # 矩阵转置
# 精度转换,低精度向高精度转
import numpy as np 
a = np.ones((2,3), dtype=int)
# np.random.random()0~1的产生随机数
b = np.random.random((2,3)) 
print('the maxtrix a is \n',a,'\n',a.dtype)
print('the maxtrix b is \n',b,'\n',b.dtype)
a *= 3
print('the a*=3 :\n',a)
b += a
print('the b=a+b:\n',b)
## a += b 
## print('the a=a+b:\n',a) # 报错,b的数据是float64,a是int32,高精度不能向低精度转换
print('the min of b is : ',b.min(),
      '\n the max of b is :',b.max(),
      '\n the max of b in the each colnum is :',b.max(axis=0) # b中每一列的最大值
      ,'\n the cumsum of b is :\n ',b.cumsum(axis=1) # 每一行累计求和
      ,'\n the diff of b is :\n',np.diff(b) # 逐行对矩阵计算相邻两数的差值
     )

数组拼接与分隔

# 数组拼接
import numpy as np 
a=np.arange(6).reshape(2,3)
b=np.floor(10*np.random.random((2,3)))
print('创建数组a:\n',a)
print('\n')
print('创建数组b:\n',b)
print('\n')
# np.concatenate()
c = np.concatenate((a,b),axis=0) # 沿着垂直方向
print('np.concatenate按行:\n',c)
print('\n')
d = np.concatenate((a,b),axis=1) # 沿着水平方向
print('np.concatenate按列:\n',d,'\n')
e = np.vstack((a,b)) # np.vstack()向下合并
f  = np.hstack((a,b)) # np.hstack()左右合并
g = np.column_stack((a,b)) # np.column_stack()和np.hstack()等效果
print('np.vstack:\n',e,'\n')
print('np.hstack:\n',f,'\n')
print('np.column_stack:\n',g,'\n')
print('np.r_的用法:\n',np.r_[1:4,0,4],'\n')
print('np.c_的用法:\n',np.c_[1:4,7:10])
# np.newaixs
import numpy as np 
a = np.array([1,2,4])
a = a[:,np.newaxis]  # 一维数组转换成2维数组,使用矩阵转置来获得是不行的
print(a)
b = np.array([7,5,3])
b = b[:,np.newaxis]
print(b)
a_b = np.column_stack((a,b))
print(a_b)
# 数组分隔
import numpy as np 
a = np.arange(1,21,1).reshape(4,5)
print(a)
split_a = np.split(a,2,axis=0)  # 按行等分2部分
# split_a = np.split(a,2,axis=1)  # 报错,提示split必须进行等分
print(split_a)
vsplit_a = np.vsplit(a,2) # 按行2等分
print(vsplit_a)
hsplit_a = np.hsplit(a.T,2) 
print(hsplit_a)
asplit_a = np.array_split(a,3,axis=1)  # 按列不等分3部分
print(asplit_a)
n_split_a = np.hsplit(a,(1,3))  # 在第1、2列处单独拆分一部分(列不包含尾部3),前后再拆成2部分
print(n_split_a)

数组条件查找

# 数组查找

# np.nonzero()只有非零元素才有索引值,索引值数组总是2维的
import numpy as np 
a = np.array([[1,0,2],
            [9,3,0]])
print('二维数组a:\n',a,'\n')
print('a中非零元素索引:\n',np.nonzero(a),'\n')  # 直接这样输出,可读性不强,转置下看看
print('索引维度数:',np.array(np.nonzero(a)).ndim,'\n') 
print('转置后索引维度:\n',np.transpose(np.nonzero(a)),'\n') # 每一行代表了非零元素索引对应原数组的行与列
print('输出非零元素一维数组:\n',a[np.nonzero(a)],'\n') # 输出非零的一维数组

a = np.array([1,0,2,5,0,8])
print('一维数组a:',a,'\n')
print('非零元素索引:',np.nonzero(a),'\n')
print('索引维度数:',np.array(np.nonzero(a)).ndim,'\n') 
print('转置后索引维度:\n',np.transpose(np.nonzero(a)),'\n') 
print('输出非零元素一维数组:\n',a[np.nonzero(a)],'\n') # 输出非零的一维数组

#np.where() 满足某条件的索引
a = np.array([1,0,4,6,8,10,5,2])
print('输出数组a:',a,'\n'
    ,'数组a中大于4的元素索引:',np.where(a>4),'\n'
      ,'数组a中大于4的元素:',a[np.where(a>4)])

#np.take()返回指定索引的若干个元素
a=np.array([4,3,5,7,6,8])
b=np.take(a,[0,1,4]) #返回索引为0,1,4的元素
print('np.take返回指定索引元素:',b)

#np.sort()数组排序
a = np.array([1,0,4,6,8,10,5,2])
print('np.sort数组排序,默认升序:',np.sort(a))    

arange & linspace & logspace

arange(start,stop,step) 与浮点参数一起使用时,精度有限
linspace(start,stop,num) 处理长精度数据更有优势

from numpy import pi
print(np.linspace( 0, 2, 9 ))          # 0~2 所有数据,分成等间隔的9个数据
print('\n')
x = np.linspace( 0, 2*pi, 100 )        # 0~2pi 数据,分成等间隔100个数据,使用arange函数就很难定义step具体值
print(x)
print('\n')
f = np.sin(x)
print(f)

Numpy中文链接:https://www.numpy.org.cn/user/quickstart.html
nonzero帮助文档翻译:https://blog.csdn.net/u013698770/article/details/54632047
numpy 参考https://www.cnblogs.com/yuxuanlian/p/numpy.html

posted @ 2021-11-18 15:18  没有风格的Wang  阅读(74)  评论(0编辑  收藏  举报