我是跟着numpy中文官方文档敲的代码,原文地址:https://www.numpy.org.cn/user_guide/quickstart_tutorial/shape_manipulation.html
下面就开始了:
改变数组形状:
>>> a = np.floor(10 * np.random.random((3,4)))
>>> a
array([[8., 9., 2., 2.],
[5., 3., 4., 6.],
[0., 9., 6., 6.]])
>>> a.shape
(3, 4)
数组的形状可以通过各种命令进行更改。请注意,以下三个命令都返回一个修改后的数组,但不要更改原始数组:
>>> a.ravel()
array([8., 9., 2., 2., 5., 3., 4., 6., 0., 9., 6., 6.])
>>> a.shape
(3, 4)
>>>> a.reshape((6,2))
array([[8., 9.],
[2., 2.],
[5., 3.],
[4., 6.],
[0., 9.],
[6., 6.]])
>>> a.shape
(3, 4)
>>> a.T
array([[8., 5., 0.],
[9., 3., 9.],
[2., 4., 6.],
[2., 6., 6.]])
>>> a.T.shape
(4, 3)
>>> a.shape
(3, 4)
>>>
a.ravel可以选择c风格的数组或Fortran风格的数组,这里我不是很明白,如果有大佬能告诉我就好了。
reshape 函数返回具有修改形状的参数,而 ndarray.resize 方法修改数组本身:
>>> a
array([[8., 9., 2., 2.],
[5., 3., 4., 6.],
[0., 9., 6., 6.]])
>>> a.resize((2,6))
>>> a
array([[8., 9., 2., 2., 5., 3.],
[4., 6., 0., 9., 6., 6.]])
>>>
如果在reshape操作中将维度指定为-1,则会自动计算其他维度:
>>> a.reshape(1,-1)
array([[8., 9., 2., 2., 5., 3., 4., 6., 0., 9., 6., 6.]])
>>> a.reshape(-1,1)
array([[8.],
[9.],
[2.],
[2.],
[5.],
[3.],
[4.],
[6.],
[0.],
[9.],
[6.],
[6.]])
>>> a.reshape(5,-1)
Traceback (most recent call last):
File "<pyshell#75>", line 1, in <module>
a.reshape(5,-1)
ValueError: cannot reshape array of size 12 into shape (5,newaxis)
>>> a.reshape(2,-1)
array([[8., 9., 2., 2., 5., 3.],
[4., 6., 0., 9., 6., 6.]])
>>>
将不同数组堆叠在一起:
>>> a = np.floor(10 * np.random.random((3,3)))
>>> a
array([[8., 8., 1.],
[7., 9., 7.],
[3., 5., 0.]])
>>> b = np.floor(10 * np.random.random((3,3)))
>>> b
array([[4., 1., 9.],
[0., 0., 4.],
[8., 8., 4.]])
>>> np.vstack((a,b))
array([[8., 8., 1.],
[7., 9., 7.],
[3., 5., 0.],
[4., 1., 9.],
[0., 0., 4.],
[8., 8., 4.]])
>>> np.hstack((a,b))
array([[8., 8., 1., 4., 1., 9.],
[7., 9., 7., 0., 0., 4.],
[3., 5., 0., 8., 8., 4.]])
>>>
多维的时候从column_stack与hstack结果相同,但是注意,一维的时候稍微不同
对于任何输入数组,函数 row_stack 相当于 vstack。一般来说,对于具有两个以上维度的数组,hstack 沿第二轴堆叠,vstack 沿第一轴堆叠,concatenate 允许一个可选参数,给出串接应该发生的轴,所以下边两个一维数组合并时,没有第二个轴,所以报错了。
>>> from numpy import newaxis
>>> np.column_stack((a,b))
array([[8., 8., 1., 4., 1., 9.],
[7., 9., 7., 0., 0., 4.],
[3., 5., 0., 8., 8., 4.]])
>>> np.row_stack((a,b))
array([[8., 8., 1.],
[7., 9., 7.],
[3., 5., 0.],
[4., 1., 9.],
[0., 0., 4.],
[8., 8., 4.]])
>>> a = np.array([4.,2.])
>>> b = np.array([7.,8.])
>>> np.column_stack((a,b))
array([[4., 7.],
[2., 8.]])
>>> np.row_stack((a,b))
array([[4., 2.],
[7., 8.]])
>>> a[:,newaxis]
array([[4.],
[2.]])
>>> np.column_stack((a[:,newaxis],b[:,newaxis]))
array([[4., 7.],
[2., 8.]])
>>> np.hstack((a[:,newaxis],b[:,newaxis]))
array([[4., 7.],
[2., 8.]])
>>> np.concatenate((a,b),axis=0)
array([4., 2., 7., 8.])
>>> np.concatenate((a,b),axis=1)
Traceback (most recent call last):
File "<pyshell#108>", line 1, in <module>
np.concatenate((a,b),axis=1)
File "<__array_function__ internals>", line 6, in concatenate
numpy.AxisError: axis 1 is out of bounds for array of dimension 1
>>> np.concatenate((a[:,newaxis],b[:,newaxis]),axis=0)
array([[4.],
[2.],
[7.],
[8.]])
>>> np.concatenate((a[:,newaxis],b[:,newaxis]),axis=1)
array([[4., 7.],
[2., 8.]])
在复杂情况下,r_ 和 c_ 可用于通过沿一个轴叠加数字来创建数组。它们允许使用范围字面量(“:”)
>>> np.r_[1,2,3]
array([1, 2, 3], dtype=int32)
>>> np.r_[1:10,56]
array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 56])
>>>
将一个数组分成几个较小的数组
使用 hsplit ,可以沿其水平轴拆分数组,通过指定要返回的均匀划分的数组数量,或通过指定要在其后进行划分的列:
>>> a = np.floor(10 * np.random.random((2,12)))
>>> a
array([[2., 8., 3., 1., 2., 4., 9., 9., 7., 3., 1., 3.],
[6., 8., 8., 2., 5., 2., 9., 3., 0., 4., 7., 1.]])
>>> np.hsplit(a,4)# Split a into 3
[array([[2., 8., 3.],
[6., 8., 8.]]), array([[1., 2., 4.],
[2., 5., 2.]]), array([[9., 9., 7.],
[9., 3., 0.]]), array([[3., 1., 3.],
[4., 7., 1.]])]
>>> np.hsplit(a,(3,4))# Split a after the third and the fourth column
[array([[2., 8., 3.],
[6., 8., 8.]]), array([[1.],
[2.]]), array([[2., 4., 9., 9., 7., 3., 1., 3.],
[5., 2., 9., 3., 0., 4., 7., 1.]])]
>>>
vsplit 沿纵轴分割,并且 array_split 允许指定沿哪个轴分割。