数组基本操作
接上一篇文章,我们了解了如何利用 NumPy 创建各式各样的 ndarray,以及数组形状和维度的概念。接下来,我们将利用学会针对 ndarray 的各种花式操作技巧。
重设形状
reshape 可以在不改变数组数据的同时,改变数组的形状。其中,numpy.reshape() 等效于 ndarray.reshape()。reshape 方法非常简单:
numpy.reshape(a, newshape)
其中,a 表示原数组,newshape 用于指定新的形状(整数或者元组)。
np.arange(10).reshape((5, 2))
数组展开
ravel 的目的是将任意形状的数组扁平化,变为 1 维数组。ravel 方法如下:
numpy.ravel(a, order='C')
其中,a 表示需要处理的数组。order 表示变换时的读取顺序,默认是按照行依次读取,当 order='F' 时,可以按列依次读取排序。
a = np.arange(10).reshape((2, 5)) a np.ravel(a) np.ravel(a, order='F')
轴移动
moveaxis 可以将数组的轴移动到新的位置。其方法如下:
numpy.moveaxis(a, source, destination)
其中:
a = np.ones((1, 2, 3))
np.moveaxis(a, 0, -1)
你可能没有看明白是什么意思,我们可以输出二者的 shape属性:
a.shape, np.moveaxis(a, 0, -1).shape
轴交换
和 moveaxis 不同的是,swapaxes 可以用来交换数组的轴。其方法如下:
numpy.swapaxes(a, axis1, axis2)
其中:
a = np.ones((1, 4, 3))
np.swapaxes(a, 0, 2)
数组转置
transpose 类似于矩阵的转置,它可以将 2 维数组的横轴和纵轴交换。其方法如下:
numpy.transpose(a, axes=None)
其中:
a = np.arange(4).reshape(2, 2) np.transpose(a)
维度改变
atleast_xd 支持将输入数据直接视为 x维。这里的 x 可以表示:1,2,3。方法分别为:
numpy.atleast_1d()
numpy.atleast_2d()
numpy.atleast_3d()
print(np.atleast_1d([1, 2, 3]))
print(np.atleast_2d([4, 5, 6]))
print(np.atleast_3d([7, 8, 9]))
类型转换
在 NumPy 中,还有一系列以 as 开头的方法,它们可以将特定输入转换为数组,亦可将数组转换为矩阵、标量,ndarray 等。如下:
这里以 asmatrix(data,dtype) 方法举例:
a = np.arange(4).reshape(2, 2)
np.asmatrix(a) # 将二维数组转化为矩阵类型
数组连接
concatenate 可以将多个数组沿指定轴连接在一起。其方法为:
numpy.concatenate((a1, a2, ...), axis=0)
其中:
a = np.array([[1, 2], [3, 4], [5, 6]]) b = np.array([[7, 8], [9, 10]]) c = np.array([[11, 12]]) np.concatenate((a, b, c), axis=0)
这里,我们可以尝试沿着横轴连接。但要保证连接处的维数一致,所以这里用到了 .T 转置。
a = np.array([[1, 2], [3, 4], [5, 6]]) b = np.array([[7, 8, 9]]) np.concatenate((a, b.T), axis=1)
数组堆叠
在 NumPy 中,以下方法可用于数组的堆叠:
这里以 stack(arrays,axis) 方法举例:
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
np.stack((a, b))
当然,也可以横着堆叠。
np.stack((a, b), axis=-1)
拆分
split 及与之相似的一系列方法主要是用于数组的拆分,列举如下:
下面,我们看一看 split 到底有什么效果:
a = np.arange(10)
np.split(a, 5)
除了 1 维数组,更高维度也是可以直接拆分的。例如,我们可以将下面的数组按行拆分为 2。
a = np.arange(10).reshape(2, 5) np.split(a, 2)
NumPy 中还有针对数组元素添加或移除的一些方法。
删除
首先是 delete 删除:
a = np.arange(12).reshape(3, 4)
np.delete(a, 2, 1)
这里代表沿着横轴,将第 3 列(索引 2)删除。当然,你也可以沿着纵轴,将第三行删除。
np.delete(a, 2, 0)
数组插入
再看一看 insert插入,用法和 delete 很相似,只是需要在第三个参数位置设置需要插入的数组对象:
a = np.arange(12).reshape(3, 4) b = np.arange(4) np.insert(a, 2, b, 0)
附加
append 的用法也非常简单。只需要设置好需要附加的值和轴位置就好了。它其实相当于只能在末尾插入的 insert,所以少了一个指定索引的参数。
a = np.arange(6).reshape(2, 3) b = np.arange(3) np.append(a, b)
注意 append方法返回值,默认是展平状态下的 1 维数组。
重设尺寸
resize 就很好理解了,直接举例子吧:
a = np.arange(10)
a.resize(2, 5)
a
你可能会纳闷了,这个 resize 看起来和上面的 reshape一样呢,都是改变数组原有的形状。
其实,它们是有区别的,区别在于对原数组的影响。reshape 在改变形状时,不会影响原数组,相当于对原数组做了一份拷贝。而 resize 则是对原数组执行操作。
翻转数组
在 NumPy 中,我们还可以对数组进行翻转操作:
a = np.arange(16).reshape(4, 4) print(np.fliplr(a)) print(np.flipud(a))
页面更新:2024-05-18
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号