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()删除不必要的行。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐