## 各种形状转换方法
>>> import numpy as np
>>> a=np.floor(10*np.random.random((3,4)))
>>> a
array([[6., 0., 1., 3.],
[6., 9., 9., 1.],
[8., 4., 8., 4.]])
>>> a.ravel()
array([6., 0., 1., 3., 6., 9., 9., 1., 8., 4., 8., 4.])
>>> a.T
array([[6., 6., 8.],
[0., 9., 4.],
[1., 9., 8.],
[3., 1., 4.]])
>>> a.T.shape
(4, 3)
>>> a.resize((2,6))
>>> a
array([[6., 0., 1., 3., 6., 9.],
[9., 1., 8., 4., 8., 4.]])
## 数组堆叠
>>> a=np.floor(10*np.random.random((2,2)))
>>> b=np.floor(10*np.random.random((2,2)))
>>> a
array([[6., 2.],
[7., 3.]])
>>> b
array([[9., 7.],
[8., 1.]])
>>> np.vstack((a,b))
array([[6., 2.],
[7., 3.],
[9., 7.],
[8., 1.]])
>>> np.hstack((a,b))
array([[6., 2., 9., 7.],
[7., 3., 8., 1.]])
>>> np.column_stack((a,b))
array([[6., 2., 9., 7.],
[7., 3., 8., 1.]])
>>> a=np.array([4.,2.])
>>> b=np.array([3.,8.])
>>> np.column_stack((a,b))
array([[4., 3.],
[2., 8.]])
>>> np.hstack((a,b))
array([4., 2., 3., 8.])
>>> np.vstack((a,b))
array([[4., 2.],
[3., 8.]])
>>> a[:,np.newaxis]
array([[4.],
[2.]])
>>> b[:,np.newaxis]
array([[3.],
[8.]])
>>> np.column_stack((a[:,np.newaxis],b[:,np.newaxis]))
array([[4., 3.],
[2., 8.]])
>>> np.hstack((a[:,np.newaxis],b[:,np.newaxis]))
array([[4., 3.],
[2., 8.]])
>>> np.r_[1:4,0,5]
array([1, 2, 3, 0, 5])
## 数组拆分
>>> a=np.floor(10*np.random.random((2,12)))
>>> a
array([[2., 0., 3., 1., 2., 5., 8., 9., 8., 0., 8., 6.],
[3., 6., 0., 3., 6., 3., 8., 3., 5., 0., 7., 2.]])
>>> np.hsplit(a,3)
[array([[2., 0., 3., 1.],
[3., 6., 0., 3.]]), array([[2., 5., 8., 9.],
[6., 3., 8., 3.]]), array([[8., 0., 8., 6.],
[5., 0., 7., 2.]])]
>>> np.hsplit(a,(3,4))
[array([[2., 0., 3.],
[3., 6., 0.]]), array([[1.],
[3.]]), array([[2., 5., 8., 9., 8., 0., 8., 6.],
[6., 3., 8., 3., 5., 0., 7., 2.]])]
>>> np.vsplit(a,3)
## 拷贝和视图
>>> import numpy as np
>>> a=np.arange(12)
>>> b=a
>>> b is a
True
>>> b.shape=3,4
>>> a.shape
(3, 4)
>>> b=a.view()
>>> b is a
False
>>> b.base is a
True
>>> b.flags.owndata
False
>>> b.shape=3,4
>>> a.shape
(3, 4)
>>> b[2,3]=222
>>> a
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 222]])
## 各种索引方法
>>> import numpy as np
>>> a=np.arange(12)**2
>>> a
array([ 0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121],
dtype=int32)
>>> i=np.array([1,1,3,8,5])
>>> a[i] # 以数组对象作为索引
array([ 1, 1, 9, 64, 25], dtype=int32)
**数组是一维时,左右两个列表分别取对应位置数字组成索引:(3,9),(4,7)**
>>> j=np.array([[3,4],[9,7]])
>>> a[j]
array([[ 9, 16],
[81, 49]], dtype=int32)
**数组是多维时,多维数组作为索引返回更高维数组**
>>> a=np.arange(12).reshape(3,4)
>>> a
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>> i=np.array([[0,1], [1,2]])
>>> j=np.array([[2,1], [3,3]])
>>> a[i]
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7]],
[[ 4, 5, 6, 7],
[ 8, 9, 10, 11]]])
>>> a[i,j]
array([[ 2, 5],
[ 7, 11]])
>>> a[i,2]
array([[ 2, 6],
[ 6, 10]])
**??**
>>> a[:,j]
array([[[ 2, 1],
[ 3, 3]],
[[ 6, 5],
[ 7, 7]],
[[10, 9],
[11, 11]]])
>>> l=[i,j]
>>> a[l]
## 通过索引获取最值
>>> time=np.linspace(20,145,5)
>>> data=np.sin(np.arange(20)).reshape(5,4)
>>> time
array([ 20. , 51.25, 82.5 , 113.75, 145. ])
>>> data
array([[ 0. , 0.84147098, 0.90929743, 0.14112001],
[-0.7568025 , -0.95892427, -0.2794155 , 0.6569866 ],
[ 0.98935825, 0.41211849, -0.54402111, -0.99999021],
[-0.53657292, 0.42016704, 0.99060736, 0.65028784],
[-0.28790332, -0.96139749, -0.75098725, 0.14987721]])
>>> ind=data.argmax(axis=0)
>>> ind
array([2, 0, 3, 1], dtype=int64)
>>> time_max=time[ind]
>>> time_max
array([ 82.5 , 20. , 113.75, 51.25])
>>> data_max=data[ind,range(data.shape[1])]
>>> data_max
array([0.98935825, 0.84147098, 0.99060736, 0.6569866 ])
>>> np.all(data_max == data.max(axis=0))
True
**修改数组会覆盖;不能加等于**
>>> a=np.arange(5)
>>> a
array([0, 1, 2, 3, 4])
>>> a[[0,0,2]]=[4,5,6]
>>> a
array([5, 1, 6, 3, 4])
>>> a[[2,3]]+=3
>>> a
array([5, 1, 9, 6, 4])
## 通过布尔值筛选并修改数组
>>> a=np.arange(12).reshape(3,4)
>>> b=a>4
>>> b
array([[False, False, False, False],
[False, True, True, True],
[ True, True, True, True]])
>>> a[b]
array([ 5, 6, 7, 8, 9, 10, 11])
>>> a[b]=0 # 是True的位置就会被修改
>>> a
array([[0, 1, 2, 3],
[4, 0, 0, 0],
[0, 0, 0, 0]])
>>> a=np.arange(12).reshape(3,4)
>>> b1=np.array([False,True,True])
>>> b2=np.array([True,False,True,False])
>>> a[b1,:] # 根据布尔值筛选行
array([[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>> a[b1]
array([[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>> a[:,b2] # 根据布尔值筛选列
array([[ 0, 2],
[ 4, 6],
[ 8, 10]])
## np.ix_()函数转化为多维数组
>>> a=np.array([2,3,4,5])
>>> b=np.array([8,5,4])
>>> c=np.array([5,4,6,8,3])
>>> ax,bx,cx = np.ix_(a,b,c)
>>> ax,bx,cx
(array([[[2]],
[[3]],
[[4]],
[[5]]]), array([[[8],
[5],
[4]]]), array([[[5, 4, 6, 8, 3]]]))
>>> ax
array([[[2]],
[[3]],
[[4]],
[[5]]])
>>> bx
array([[[8],
[5],
[4]]])
>>> cx
array([[[5, 4, 6, 8, 3]]])
>>> ax.shape,bx.shape,cx.shape
((4, 1, 1), (1, 3, 1), (1, 1, 5))
>>> bx*cx
array([[[40, 32, 48, 64, 24],
[25, 20, 30, 40, 15],
[20, 16, 24, 32, 12]]])
>>> result=ax+bx*cx
\
>>> result # 元素个数分别为4,3,5,返回数组形状(4,3,5)
array([[[42, 34, 50, 66, 26],
[27, 22, 32, 42, 17],
[22, 18, 26, 34, 14]],
[[43, 35, 51, 67, 27],
[28, 23, 33, 43, 18],
[23, 19, 27, 35, 15]],
[[44, 36, 52, 68, 28],
[29, 24, 34, 44, 19],
[24, 20, 28, 36, 16]],
[[45, 37, 53, 69, 29],
[30, 25, 35, 45, 20],
[25, 21, 29, 37, 17]]])
>>> result[3,2,4]
17
>>> a[3]+b[2]*c[4]
17
## 设置形状时,-1表示取任何值
>>> a=np.arange(30)
>>> shape=2,-1,3
>>> a.reshape(shape)
array([[[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11],
[12, 13, 14]],
[[15, 16, 17],
[18, 19, 20],
[21, 22, 23],
[24, 25, 26],
[27, 28, 29]]])