Python 常用模块系列:
- [Python] 常用模块(1):内建模块 – random & datetime
- [Python] 常用模块(2):内建模块 – re 以及正则表达式
- [Python] 常用模块(3):内建模块 – math & itertools
- [Python] 常用模块(4):NumPy 上
- [Python] 常用模块(4):NumPy 中
- [Python] 常用模块(4):NumPy 下(本文)
- [Python] 常用模块(5):pandas 1
- [Python] 常用模块(5):pandas 2
- [Python] 常用模块(5):pandas 3
- [Python] 常用模块(5):pandas 4
- [Python] 常用模块(5):pandas 5
- [Python] 常用模块(5):pandas 6
- [Python] 常用模块(5):pandas 7
- [Python] 常用模块(5):pandas 8
- [Python] 常用模块(5):pandas 9
文章目录
本篇介绍对数组的操纵。
数组的变形
ndarray.reshape(shape)
将数组变形。
>>> a = np.arange(6)
>>> a
array([0, 1, 2, 3, 4, 5])
>>> a.reshape(2, 3)
array([[0, 1, 2],
[3, 4, 5]])
np.ravel(a) 和 ndarray.flatten()
打平一个多维数组。这两个命令其实是有区别的(不只是函数和方法的区别),这里就不深究了。
>>> a = np.array([[1,2], [3,4]])
>>> np.ravel(a)
array([1, 2, 3, 4])
>>> a.flatten()
array([1, 2, 3, 4])
数组的合并
np.concatenate(*array, axis = 0)
以轴合并多个数组。若轴为 None
,则合并以前先将数组打平。
>>> a = np.array([[1, 2], [3, 4]])
>>> b = np.array([[5, 6]])
>>> np.concatenate((a, b), axis=0)
array([[1, 2],
[3, 4],
[5, 6]])
>>> np.concatenate((a, b.T), axis=1)
array([[1, 2, 5],
[3, 4, 6]])
>>> np.concatenate((a, b), axis=None)
array([1, 2, 3, 4, 5, 6])
np.hstack(tuple),np.vstack(tuple),np.dstack(tuple)
将数组以水平、垂直或深度的序列合并。(老宅知道轴很让人费解,以后会专门讨论)
>>> a = np.array((1,2,3))
>>> b = np.array((2,3,4))
>>> np.hstack((a,b))
array([1, 2, 3, 2, 3, 4])
>>> np.vstack((a,b))
array([[1, 2, 3],
[2, 3, 4]])
>>> np.dstack((a,b))
array([[[1, 2],
[2, 3],
[3, 4]]])
数组的拆分
np.split(array, ind_or_sec, axis = 0)
以轴拆分数组。若 ind_or_sec
为一个整数,则将数组分成若干等分;若为一个列表,则以列表中元素为索引进行拆分;若索引超过了数组的维度,返回一个空数组。例子:以 [2, 3]
拆分,则以 [:2]
,[2:3]
和 [3:]
对数组进行拆分。
>>> x = np.arange(9.0)
>>> np.split(x, 3)
[array([ 0., 1., 2.]), array([ 3., 4., 5.]), array([ 6., 7., 8.])]
>>> x = np.arange(8.0)
>>> np.split(x, [3, 5, 6, 10])
[array([ 0., 1., 2.]),
array([ 3., 4.]),
array([ 5.]),
array([ 6., 7.]),
array([], dtype=float64)]
np.hsplit(array, ind_or_sec),np.vsplit(array, ind_or_sec(array, ind_or_sec),np.dsplit(array, ind_or_sec)
与 np.hstack
,np.vstack
和 np.dstack
的操作视角一致,与 np.split
的前两个参数一致。
>>> x = np.arange(8.0).reshape(2, 2, 2)
>>> x
array([[[ 0., 1.],
[ 2., 3.]],
[[ 4., 5.],
[ 6., 7.]]])
>>> np.hsplit(x, 2)
[array([[[ 0., 1.]],
[[ 4., 5.]]]),
array([[[ 2., 3.]],
[[ 6., 7.]]])]
>>> np.vsplit(x, 2)
[array([[[ 0., 1.],
[ 2., 3.]]]),
array([[[ 4., 5.],
[ 6., 7.]]])]
>>> np.dsplit(x, 2)
[array([[[0.],
[2.]],
[[4.],
[6.]]]), array([[[1.],
[3.]],
[[5.],
[7.]]])]
数组的重复和拼贴
np.tile(a, reps)
将数组 a 以拼贴整个数组的形式复制 reps 遍。
>>> a = np.array([0, 1, 2])
>>> np.tile(a, 2)
array([0, 1, 2, 0, 1, 2])
>>> np.tile(a, (2, 2))
array([[0, 1, 2, 0, 1, 2],
[0, 1, 2, 0, 1, 2]])
>>> np.tile(a, (2, 1, 2))
array([[[0, 1, 2, 0, 1, 2]],
[[0, 1, 2, 0, 1, 2]]]) # 仔细观察新数组的维度
np.repeat(a, reps, axis = None)
将数组 a 以重复 a 内元素的方式复制 reps 遍。若未指定轴,则复制前先将数组打平。
>>> np.repeat(3, 4)
array([3, 3, 3, 3])
>>> x = np.array([[1,2],[3,4]])
>>> np.repeat(x, 2)
array([1, 1, 2, 2, 3, 3, 4, 4])
>>> np.repeat(x, 3, axis=1)
array([[1, 1, 1, 2, 2, 2],
[3, 3, 3, 4, 4, 4]])
>>> np.repeat(x, [1, 2], axis=0)
array([[1, 2],
[3, 4],
[3, 4]])
添加和删除数组内的元素
np.delete(array, obj, axis = None)
按照 object(可以是整数或表示索引的列表)删除指定元素。若轴未指定,则先将数组打平。
>>> arr = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]])
>>> arr
array([[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12]])
>>> np.delete(arr, 1, 0)
array([[ 1, 2, 3, 4],
[ 9, 10, 11, 12]])
>>> np.delete(arr, [1,3,5], None)
array([ 1, 3, 5, 7, 8, 9, 10, 11, 12])
np.insert(arr, obj, values, axis = None)
在指定位置插入元素。若轴未指定,则先将数组打平。
>>> a = np.array([[1, 1], [2, 2], [3, 3]])
>>> a
array([[1, 1],
[2, 2],
[3, 3]])
>>> np.insert(a, 1, 5)
array([1, 5, 1, 2, 2, 3, 3])
>>> np.insert(a, 1, 5, axis=1)
array([[1, 5, 1],
[2, 5, 2],
[3, 5, 3]])
np.append(arr, values, axis = None)
在数组结尾添加元素。若轴未指定,则先将数组打平。
>>> np.append([1, 2, 3], [[4, 5, 6], [7, 8, 9]])
array([1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> np.append([[1, 2, 3], [4, 5, 6]], [[7, 8, 9]], axis=0)
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])