改变数组的形状
数组的形状可以改变,但是元素不可以改变。
在reshape()的操作中,如果某个方向的大小设置为-1,则会根据其他方向上设定的大小来计算-1这个方向的大小。
>>> a = np.range(24)
>>> a.reshape([2,3,4])
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]]])
>>> a.reshape([2,3,-1])
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]]])
# 根据2,3自动推导得-1其实是“4”
也可以进行转置操作,使用T属性
>>> a.reshape(4,-1)
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]])
>>> a.reshape(4,-1).T
array([[ 0, 6, 12, 18],
[ 1, 7, 13, 19],
[ 2, 8, 14, 20],
[ 3, 9, 15, 21],
[ 4, 10, 16, 22],
[ 5, 11, 17, 23]])
对于维度大于2的数组,可以使用transpose()函数来进行重新排列。通过排列各个轴的轴号,从而实现数组结构的改变
>>> a = a.reshape([2,3,4])
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]]])
>>> a.transpose((2,1,0))
array([[[ 0, 12],
[ 4, 16],
[ 8, 20]],
[[ 1, 13],
[ 5, 17],
[ 9, 21]],
[[ 2, 14],
[ 6, 18],
[10, 22]],
[[ 3, 15],
[ 7, 19],
[11, 23]]])
这里的(2,1,0)是转换坐标轴的结果。就是指原来的0(可想成x)轴变成了2(可想成z)轴。原来的1(y)轴不变。
大家可以使用三维坐标系来找点,也可以参照这篇博客:https://blog.csdn.net/u012762410/article/details/78912667
画一画坐标系就可以得到。
也可以使用ravel()函数改变数组的形状,他会逐行读取元素并返回一维数组。
也可以使用resize()函数,和reshape()不一样的地方在于,它会直接改变数组
组装、分割数组
- 垂向组装两个二维数组
>>> a = np.random.rand(2,2)
array([[0.38646058 0.54026921],
[0.7098984 0.15758503]])
>>> b = np.random.rand(2,2)
array([[0.22686851 0.15525425],
[0.0545175 0.5187691 ]])
>>> np.vstack((a,b))
array([[0.38646058 0.54026921],
[0.7098984 0.15758503],
[0.22686851 0.15525425],
[0.0545175 0.5187691 ]])
- 横向组长两个二维数组
>>> np.hstack((a,b))
array([[0.38646058, 0.54026921, 0.22686851, 0.15525425],
[0.7098984 , 0.15758503, 0.0545175 , 0.5187691 ]])
- 分割数组,比如可以通过在第二列和第四列对数组进行分割,得到三个数组,三个数组在横轴上的长度分别是2、2、4
>>> a = np.range(32).reshape(4,8)
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 30 31]])
>>> np.hsplit(a,[2,4])
[array([[ 0, 1],
[ 8, 9],
[16, 17],
[24, 25]]),
array([[ 2, 3],
[10, 11],
[18, 19],
[26, 27]]),
array([[ 4, 5, 6, 7],
[12, 13, 14, 15],
[20, 21, 22, 23],
[28, 29, 30, 31]])]