Numpy进阶之形状操作

我是跟着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 允许指定沿哪个轴分割。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值