Numpy-形状操纵

本文介绍了如何使用Numpy库来改变数组的形状,包括ravel、reshape、resize、transpose等方法,以及如何沿不同轴叠加数组和拆分数组。示例展示了各个函数的具体用法,帮助理解Numpy中数组形状操作的原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

改变数组的形状
一个数组的形状是由每个轴的元素数量决定的
In [1]:
import numpy as np
In [2]:
a = np.floor(10np.random.random((3,4)))
a
Out[2]:
array([[1., 2., 2., 5.],
[3., 0., 5., 5.],
[5., 7., 2., 4.]])
In [3]:
a.shape
Out[3]:
(3, 4)
In [4]:
a.dtype
Out[4]:
dtype(‘float64’)
可以使用各种命令更改数组的形状。请注意,以下三个命令都返回一个修改后的数组,但不会更改原数组
In [5]:
a.ravel()
Out[5]:
array([1., 2., 2., 5., 3., 0., 5., 5., 5., 7., 2., 4.])
In [6]:
a.reshape(6,2)
Out[6]:
array([[1., 2.],
[2., 5.],
[3., 0.],
[5., 5.],
[5., 7.],
[2., 4.]])
In [7]:
a.T
Out[7]:
array([[1., 3., 5.],
[2., 0., 7.],
[2., 5., 2.],
[5., 5., 4.]])
由ravel产生的数组中元素的顺序通常是C风格的,也就是说,最右边的索引变化最快,因此(0,0)之后的元素是(0,1)。则该数组被视为C风格。Numpy通常创建按此顺序存储的数组,因此ravel()通常不需要复制其参数,但如果数组是通过获取另一个数组的切片或使用不常见的选项创建的,则可能需要复制它。还可以使用可选参数指示函数ravel()和reshape(),以使用FORTRAN样式的数组,其中最左边的索引变化最快。
该reshape函数返回带有修改形状的数组,而ndarray.resize方法会修改数组本身
In [8]:
a
Out[8]:
array([[1., 2., 2., 5.],
[3., 0., 5., 5.],
[5., 7., 2., 4.]])
In [9]:
a.resize((2,6))
a
Out[9]:
array([[1., 2., 2., 5., 3., 0.],
[5., 5., 5., 7., 2., 4.]])
In [10]:
a.reshape((3,-1))
Out[10]:
array([[1., 2., 2., 5.],
[3., 0., 5., 5.],
[5., 7., 2., 4.]])
In [11]:
a.resize(6,2)
a
Out[11]:
array([[1., 2.],
[2., 5.],
[3., 0.],
[5., 5.],
[5., 7.],
[2., 4.]])
将不同数组叠加在一起
几个数组可以沿不同的轴叠加在一起
In [12]:
a=np.floor(10
np.random.random((2,2)))
a
Out[12]:
array([[2., 3.],
[9., 5.]])
In [13]:
b=np.floor(10np.random.random((2,2)))
b
Out[13]:
array([[2., 7.],
[4., 9.]])
In [14]:
np.vstack((a,b))
Out[14]:
array([[2., 3.],
[9., 5.],
[2., 7.],
[4., 9.]])
In [15]:
np.hstack([a,b])
Out[15]:
array([[2., 3., 2., 7.],
[9., 5., 4., 9.]])
column_stack函数将一维数组按列堆叠到二维数组。它仅相当于hstack中二维数组
In [16]:
np.column_stack((a,b))
Out[16]:
array([[2., 3., 2., 7.],
[9., 5., 4., 9.]])
In [17]:
a=np.array([4,2])
b=np.array([3,8])
In [18]:
np.column_stack((a,b))
Out[18]:
array([[4, 3],
[2, 8]])
In [19]:
np.hstack((a,b))
Out[19]:
array([4, 2, 3, 8])
In [20]:
np.vstack((a,b))
Out[20]:
array([[4, 2],
[3, 8]])
In [21]:
a[:,np.newaxis]
Out[21]:
array([[4],
[2]])
In [22]:
np.column_stack((a[:,np.newaxis],b[:,np.newaxis]))
Out[22]:
array([[4, 3],
[2, 8]])
In [23]:
np.hstack((a[:,np.newaxis],b[:,np.newaxis]))
Out[23]:
array([[4, 3],
[2, 8]])
另一方面,该函数ma.row_stack等效于vstack于任何输入数组。通常对于具有两个以上维度的数组,hstack沿其第二轴,vstack沿其第一轴堆叠,并且concatenate允许可选参数给出连接应发生的轴的编号,注意:在复杂的情况下,r_和c_应用于通过沿一个轴堆叠数字来创建数组很有用。它们允许使用范围操作符:
In [24]:
np.r_[1:4,0,4]
Out[24]:
array([1, 2, 3, 0, 4])
与数组一起使用时,r_和c_在默认行为上类似于vstack和hstack,但允许使用可选参数给出要连接轴的编号
将一个数组拆分成几个较小的数组
使用hsplit,可以沿数组的水平轴拆分数组,方法是指定要返回的形状相等的数组的数量,或者指定应该在其之后进行分割的列
In [25]:
a=np.floor(10
np.random.random((2,12)))
a
Out[25]:
array([[6., 0., 7., 0., 1., 5., 4., 6., 7., 0., 9., 0.],
[0., 4., 4., 3., 9., 0., 4., 8., 2., 0., 8., 8.]])
In [26]:
np.hsplit(a,3)
Out[26]:
[array([[6., 0., 7., 0.],
[0., 4., 4., 3.]]), array([[1., 5., 4., 6.],
[9., 0., 4., 8.]]), array([[7., 0., 9., 0.],
[2., 0., 8., 8.]])]
In [27]:
np.hsplit(a,(3,4)) #用第三列和第四列进行分割
Out[27]:
[array([[6., 0., 7.],
[0., 4., 4.]]), array([[0.],
[3.]]), array([[1., 5., 4., 6., 7., 0., 9., 0.],
[9., 0., 4., 8., 2., 0., 8., 8.]])]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值