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