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

19_NumPy如何使用insert将元素/行/列插入/添加到数组ndarray可以使用numpy.insert()函数将元素,行和列插入(添加)到NumPy数组ndarray。这里将对以下内容与示例代码一起解释。numpy.insert()概述一维数组使用numpy.insert()插入和添加元素替换元素二维数组的行使用numpy.insert()插入和添加行在numpy.vstack()的开头和结尾添加行行的置换二维数组的列使用numpy.insert()插入和添 在数据末尾做追加,有返回值,不改变原来数组的结构 如果是多维数组,append后变成一维数组,在末尾添加 如果是多维数组添加多维数组,append后也变成一维数组 arr1=np.arange(10,20) arr2=np.arange(20,30) arr3=np.arange(20).reshape(...
对于一个numpyarray数组,可以利用np.rowstack()添加,np.column_stack()添加一列 h = np.array([[1,2,3],[4,5,6],[7,8,9]]) 在第一列添加一列 h = np.column_stack((np.arange(1,4),h)) 在最后添加 h = np.row_stack((h,np.arange(1,5))) 注意添加要和原来array数组的大小相匹配 numpy arra
Pythonndarray数组加入一元素 ndarraynumpy扩展库下的内容,用来表示多维数组(n-dimensions array): import numpy as np a=np.array([[1,2],[3,4],[5,6]]) 事先不知道数组的尺寸可以先定义一个空数组,再向其中加入元素: b = np.array([]) # 筛选a的每一中所有元素都大于2的,并保存到b中 b = np.append(b, [row for row in sen_angle if min(row)
ros_numpy 用于将ROS消息与numpy数组相互转换的工具。 包含两个功能: arr = numpify(msg, ...) -尝试从消息中获取一个numpy对象 msg = msgify(MessageType, arr, ...) -尝试将numpy对象转换为消息 目前支持: sensor_msgs.msg.PointCloud2 :left-right_arrow: 结构化的np.array : data = np . zeros ( 100 , dtype = [ ( 'x' , np . float32 ), ( 'y' , np . float32 ), ( 'vectors' , np . float32 , ( 3 ,)) data [ 'x' ] = np . arange ( 100 ) data [ 'y' ] = data [ 'x' ] * 2 data [ '
1. 切片操作:可以使用numpy数组的切片操作来获取数组元素的周围元素。 例如,对于一个二维数组arr,要获取第i第j元素周围的元素,可以使用如下切片操作: ```python arr[i-1:i+2, j-1:j+2] 这将返回一个3x3的子数组,其中心元素为arr[i,j],周围的8个元素为该子数组的其余元素。 2. 使用numpy.pad()函数:numpy.pad()函数可以用来在数组的边缘添加一个或多个值,从而扩展数组的大小。可以使用该函数来添加额外的,然后通过索引访问周围的元素。 例如,对于一个二维数组arr,要获取第i第j元素周围的元素,可以使用如下代码: ```python padded_arr = np.pad(arr, ((1, 1), (1, 1)), mode='constant') surrounding = padded_arr[i:i+3, j:j+3] 这将在数组的边缘添加一列,并使用常量值填充这些额外的元素。然后可以使用切片操作来获取中心元素周围的元素。 3. 使用numpy.roll()函数:numpy.roll()函数可以用来沿着给定轴滚动数组元素。可以使用该函数来将数组滚动,从而获取周围的元素。 例如,对于一个二维数组arr,要获取第i第j元素周围的元素,可以使用如下代码: ```python rows, cols = arr.shape row_indices = np.arange(i-1, i+2) % rows col_indices = np.arange(j-1, j+2) % cols surrounding = arr[row_indices][:, col_indices] 这将将第i向上和向下滚动一,并将第j向左和向右滚动一列,从而获取中心元素周围的元素使用模运算可以确保在数组的边缘滚动时正确处理索引。