(1)ravel 我们可以用ravel函数完成展平的操作:
In: b
Out:
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]]])
In:b.ravel()
Out:
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)flatten 这个函数恰如其名,flatten就是展平的意思,与ravel函数的功能相同。
不过,flatten函数会请求分配内存来保存结果,而ravel函数只是返回数组的一个视图(view):
In:b.flatten()
Out:
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])
(3)用元组设置维度 除了可以使用reshape函数,我们也可以直接用一个正整数元组来设
置数组的维度,如下所示:
In:b.shape = (6,4)
In: b
Out:
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]],
正如你所看到的,这样的做法将直接改变所操作的数组,现在数组b成了一个6×4的多维数组。
(4)transpose 在线性代数中,转置矩阵是很常见的操作。对于多维数组,我们也可以这样做:
In:b.transpose()
Out:
array([[0, 4, 8, 12, 16, 20],
[ 1, 5,9, 13, 17, 21],
[ 2,6,10, 14, 18, 22],
[ 3,7,11, 15, 19, 23]])
(5)resize resize和reshape函数的功能一样,但resize会直接修改所操作的数组:
In:b.resize((2,12))
In: b
Out:
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]])
动手实践:组合数组
首先,我们来创建一些数组:
In: a =arange(9).reshape(3,3)
In: a
Out:
array([[0,1, 2],
[3, 4,5],
[6, 7,8]])
In: b =2 * a
In: b
Out:
array([[0, 2, 4],
[ 6, 8,10],
[12,14,16]])
(1)水平组合 我们先从水平组合开始练习。将ndarray对象构成的元组作为参数,传给
hstack函数。如下所示:
In:hstack((a, b))
Out:
array([[0, 1, 2, 0, 2, 4],
[ 3, 4,5, 6, 8,10],
[ 6, 7,8,12,14,16]])
我们也可以用concatenate函数来实现同样的效果,如下所示:
In:concatenate((a, b), axis=1)
Out:
array([[0, 1, 2, 0, 2, 4],
[ 3, 4,5, 6, 8,10],
[ 6, 7, 8,12,14,16]])
(2)垂直组合 垂直组合同样需要构造一个元组作为参数,只不过这次的函数变成了
vstack。如下所示:
In:vstack((a, b))
Out:
array([[0, 1, 2],
[ 3, 4,5],
[ 6, 7,8],
[ 0, 2,4],
[ 6,8,10],
[12,14,16]])
同样,我们将concatenate函数的axis参数设置为0即可实现同样的效果。这也是axis参
数的默认值:
In:concatenatel((a, b), axis = 0)
Out:
array([[0, 1, 2],
[ 3, 4,5],
[ 6, 7,8],
[ 0, 2,4],
[ 6,8,10],
[12,14,16]])
(3) 深度组合
In:dstack((a, b))
Out:
array([[[0,0],
[1, 2],
[2, 4]],
[[3, 6],
[4, 8],
[5,10]],
[[6,12],
[7,14],
[8,16]]])
(4)列组合 column_stack函数对于一维数组将按列方向进行组合,如下所示:
In: oned= arange(2)
In: oned
Out:array([0, 1])
In:twice_oned = 2 * oned
In:twice_oned
Out:array([0, 2])
In:column_stack((oned, twice_oned))
Out:
array([[0,0],
[1, 2]])
而对于二维数组,column_stack与hstack的效果是相同的:
In:column_stack((a, b))
Out:
array([[0, 1, 2, 0, 2, 4],
[ 3, 4,5, 6, 8,10],
[ 6, 7,8,12,14,16]])
In:column_stack((a, b)) == hstack((a, b))
Out:
array([[True, True, True, True, True, True],
[ True,True, True, True, True, True],
[ True,True, True, True, True, True]], dtype=bool)
是的,你猜对了!我们可以用==运算符来比较两个NumPy数组,是不是很简洁?
(5)行组合 当然,NumPy中也有按行方向进行组合的函数,它就是row_stack。对于两
个一维数组,将直接层叠起来组合成一个二维数组。
In:row_stack((oned, twice_oned))
Out:
array([[0,1],
[0, 2]])
对于二维数组,row_stack与vstack的效果是相同的:
In:row_stack((a, b))
Out:
array([[0, 1, 2],
[ 3, 4,5],
[ 6, 7,8],
[ 0, 2,4],
[ 6,8,10],
[12,14,16]])
In:row_stack((a,b)) == vstack((a, b))
Out:
array([[True, True, True],
[ True,True, True],
[ True,True, True],
[ True,True, True],
[ True,True, True],
[ True,True, True]], dtype=bool)