19_NumPy如何使用insert将元素/行/列插入/添加到数组ndarray
可以使用numpy.insert()函数将元素,行和列插入(添加)到NumPy数组ndarray。
这里将对以下内容与示例代码一起解释。
- numpy.insert()概述
- 一维数组
- 使用numpy.insert()插入和添加元素
- 替换元素
- 二维数组的行
- 使用numpy.insert()插入和添加行
- 在numpy.vstack()的开头和结尾添加行
- 行的置换
- 二维数组的列
- 使用numpy.insert()插入和添加列
- 在numpy.vstack()的开头和结尾添加列
- 列的置换
numpy.insert()概述
np.insert()函数的参数如下。
- arr:原始NumPy数组ndarray
- obj:插入值的位置,int,slice,list
- value:要插入的元素/行/列的值
- axis:插入值的轴(尺寸)
原始的NumPy数组ndarray保持不变,并返回一个新的ndarray。
一维数组
使用numpy.insert()插入和添加元素
将元素插入一维数组时,请设置参数axis = np.insert()的值无(默认值可以省略)。
还可以通过在列表或数组中指定参数值来插入多个元素。
import numpy as np
a = np.arange(4)
print(a)
# [0 1 2 3]
print(np.insert(a, 2, 100))
# [ 0 1 100 2 3]
print(np.insert(a, 1, [100, 101, 102]))
# [ 0 100 101 102 1 2 3]
print(np.insert(a, [0, 2, 4], [100, 101, 102]))
# [100 0 1 101 2 3 102]
替换元素
如果要替换一维数组的元素,可以编写:原始的ndarray值被替换了,因此为方便起见创建并处理了一个副本。
_a = a.copy()
_a[1] = 100
print(_a)
# [ 0 100 2 3]
_a = a.copy()
_a[1:3] = [100, 101]
print(_a)
# [ 0 100 101 3]
在替换前后更改ndarray形状的操作将导致错误。例如,如果要用多个元素替换一个元素。
# _a = a.copy()
# _a[1] = [100, 101, 102]
# print(_a)
# ValueError: setting an array element with a sequence.
用np.insert()插入并用np.delete()删除不必要的值后,可以获得所需的数组。
_a = np.insert(a, 1, [100, 101, 102])
_a = np.delete(_a, 4)
print(_a)
# [ 0 100 101 102 2 3]
二维数组的行
使用numpy.insert()插入和添加行
如果参数axis = None(默认值),则即使原始ndarray是多维数组,也将返回展平的一维数组。
a = np.arange(12).reshape((3, 4))
print(a)
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
print(np.insert(a, 2, 100))
# [ 0 1 100 2 3 4 5 6 7 8 9 10 11]
如果要将行插入二维数组ndarray中,请设置axis = 0。
如果为参数值指定了标量值,则将插入用该值填充的行。
print(np.insert(a, 2, 100, axis=0))
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [100 100 100 100]
# [ 8 9 10 11]]
插入一维数组ndarray
可以插入一维数组ndarray或列表,其元素数等于原始ndarray的列数。
指定插入位置的参数obj也可以指定为列表或数组。在这种情况下,同一行将插入到每一行中。
b1 = np.arange(100, 104)
print(b1)
# [100 101 102 103]
print(np.insert(a, 1, b1, axis=0))
# [[ 0 1 2 3]
# [100 101 102 103]
# [ 4 5 6 7]
# [ 8 9 10 11]]
print(np.insert(a, 3, b1, axis=0))
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]
# [100 101 102 103]]
print(np.insert(a, [0, 2], b1, axis=0))
# [[100 101 102 103]
# [ 0 1 2 3]
# [ 4 5 6 7]
# [100 101 102 103]
# [ 8 9 10 11]]
插入二维数组ndarray
还可以插入与原始ndarray具有相同列数的二维数组ndarray。
当将指定插入位置的参数obj指定为列表(数组)时,将在每个位置插入每一行。
b2 = np.arange(100, 112).reshape((3, 4))
print(b2)
# [[100 101 102 103]
# [104 105 106 107]
# [108 109 110 111]]
print(np.insert(a, 2, b2, axis=0))
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [100 101 102 103]
# [104 105 106 107]
# [108 109 110 111]
# [ 8 9 10 11]]
print(np.insert(a, 2, b2[2], axis=0))
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [108 109 110 111]
# [ 8 9 10 11]]
print(np.insert(a, [0, 2, 3], b2, axis=0))
# [[100 101 102 103]
# [ 0 1 2 3]
# [ 4 5 6 7]
# [104 105 106 107]
# [ 8 9 10 11]
# [108 109 110 111]]
print(np.insert(a, range(3), b2, axis=0))
# [[100 101 102 103]
# [ 0 1 2 3]
# [104 105 106 107]
# [ 4 5 6 7]
# [108 109 110 111]
# [ 8 9 10 11]]
在numpy.vstack()的开头和结尾添加行
如果要在ndarray的开头或结尾而不是在中间添加一行,除了np.insert()之外,还可以使用np.vstack()垂直连接ndarray。
元素数量等于原始ndarray的列数的一维数组ndarray或具有与原始ndarray相同列数的二维数组ndarray都可以。
print(np.vstack((a, b1)))
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]
# [100 101 102 103]]
print(np.vstack((b2, a)))
# [[100 101 102 103]
# [104 105 106 107]
# [108 109 110 111]
# [ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
行的置换
如果要替换一行,可以编写:原始ndarray已更改。
如果所选的行数相同,则切片或列表都可以。
_a = a.copy()
_a[2] = b1
print(_a)
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [100 101 102 103]]
_a = a.copy()
_a[1] = b2[1]
print(_a)
# [[ 0 1 2 3]
# [104 105 106 107]
# [ 8 9 10 11]]
_a = a.copy()
_a[1:] = b2[[0, 2]]
print(_a)
# [[ 0 1 2 3]
# [100 101 102 103]
# [108 109 110 111]]
与一维数组一样,更改形状(行数)的操作会导致错误,因此在使用np.insert()插入后,请使用np.delete()删除不必要的行。
二维数组的列
使用numpy.insert()插入和添加列
如果要在二维数组ndarray中插入一列,请设置axis = 1。基本上与该行的过程相同。
print(a)
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
print(np.insert(a, 1, 100, axis=1))
# [[ 0 100 1 2 3]
# [ 4 100 5 6 7]
# [ 8 100 9 10 11]]
c1 = np.arange(100, 103)
print(c1)
# [100 101 102]
print(np.insert(a, 1, c1, axis=1))
# [[ 0 100 1 2 3]
# [ 4 101 5 6 7]
# [ 8 102 9 10 11]]
print(np.insert(a, 3, c1, axis=1))
# [[ 0 1 2 100 3]
# [ 4 5 6 101 7]
# [ 8 9 10 102 11]]
插入二维数组ndarray时,请注意指定插入位置的参数obj。
如果要将obj指定为标量值,除非指定[x]而不是x,否则会发生错误。
c2 = np.arange(100, 106).reshape((3, 2))
print(c2)
# [[100 101]
# [102 103]
# [104 105]]
# print(np.insert(a, 1, c2, axis=1))
# ValueError: could not broadcast input array from shape (2,3) into shape (3,3)
print(np.insert(a, [1], c2, axis=1))
# [[ 0 100 101 1 2 3]
# [ 4 102 103 5 6 7]
# [ 8 104 105 9 10 11]]
print(np.insert(a, [0, 2], c2, axis=1))
# [[100 0 1 101 2 3]
# [102 4 5 103 6 7]
# [104 8 9 105 10 11]]
即使仅插入一列,输出也会根据插入的是一维数组还是二维数组而有所不同。这里不讨论细节,而是遵循广播规则的结果。
插入一维数组时,如果将参数obj设置为[x]或在列表(数组)中指定多个位置,则结果将与预期的不同。
print(c1)
# [100 101 102]
print(np.insert(a, 1, c1, axis=1))
# [[ 0 100 1 2 3]
# [ 4 101 5 6 7]
# [ 8 102 9 10 11]]
print(np.insert(a, [1], c1, axis=1))
# [[ 0 100 101 102 1 2 3]
# [ 4 100 101 102 5 6 7]
# [ 8 100 101 102 9 10 11]]
print(np.insert(a, [1, 3, 4], c1, axis=1))
# [[ 0 100 1 2 101 3 102]
# [ 4 100 5 6 101 7 102]
# [ 8 100 9 10 101 11 102]]
_c1 = c1.reshape((3, 1))
print(_c1)
# [[100]
# [101]
# [102]]
print(np.insert(a, 1, _c1, axis=1))
# [[ 0 100 101 102 1 2 3]
# [ 4 100 101 102 5 6 7]
# [ 8 100 101 102 9 10 11]]
print(np.insert(a, [1], _c1, axis=1))
# [[ 0 100 1 2 3]
# [ 4 101 5 6 7]
# [ 8 102 9 10 11]]
print(np.insert(a, [1, 3, 4], _c1, axis=1))
# [[ 0 100 1 2 100 3 100]
# [ 4 101 5 6 101 7 101]
# [ 8 102 9 10 102 11 102]]
在numpy.vstack()的开头和结尾添加列
如果要在ndarray的开头或结尾而不是在中间添加列,则除了np.insert()之外,还可以使用水平连接ndarray的np.hstack()。
请注意,如果原始ndarray和要添加的ndarray的尺寸不匹配,则会发生错误。即使只有一列,也必须使用reshape()方法将其转换为二维数组。
# print(np.hstack((a, c1)))
# ValueError: all the input arrays must have same number of dimensions
print(_c1)
# [[100]
# [101]
# [102]]
print(np.hstack((a, _c1)))
# [[ 0 1 2 3 100]
# [ 4 5 6 7 101]
# [ 8 9 10 11 102]]
print(np.hstack((_c1, a)))
# [[100 0 1 2 3]
# [101 4 5 6 7]
# [102 8 9 10 11]]
print(np.hstack((a, c2)))
# [[ 0 1 2 3 100 101]
# [ 4 5 6 7 102 103]
# [ 8 9 10 11 104 105]]
print(np.hstack((c2, a)))
# [[100 101 0 1 2 3]
# [102 103 4 5 6 7]
# [104 105 8 9 10 11]]
列的置换
如果要替换列,可以编写:原始ndarray已更改。
如果选择的列数相同,则切片或列表确定。
_a = a.copy()
_a[:, 1] = c1
print(_a)
# [[ 0 100 2 3]
# [ 4 101 6 7]
# [ 8 102 10 11]]
_a = a.copy()
_a[:, :2] = c2
print(_a)
# [[100 101 2 3]
# [102 103 6 7]
# [104 105 10 11]]
_a = a.copy()
_a[:, [0, 3]] = c2
print(_a)
# [[100 1 2 101]
# [102 5 6 103]
# [104 9 10 105]]
与前面的示例一样,更改形状(列数)的操作将导致错误,因此在使用np.insert()插入后,请使用np.delete()删除不必要的行。