如何在矩阵 ( python ) 中的所需位置插入额外的行和列?

How to insert extra rows and columns at desired location in a matrix ( python )?

我是 运行 一个循环,从那里我获得了(4 x 4)数组,现在我想在这些数组的某些位置插入零并将它们变成(6 x 6)数组。

我想在第三行和第六行以及第三列和第六列添加零

a_obtained = np.array( [[1,     2,   3,    4   ],
                        [5,     6,   7,    8   ],
                        [9,    10,   11,  12   ],
                        [13,   14,   15,   16  ]])

我尝试遍历 np.vstack、np.hstack,但我无法将零放在指定位置。

a_desired = result = np.array([[1,     2,  0,   3,    4,   0 ],
                               [5,     6,  0,   7,    8,   0 ],
                               [0,     0,  0,   0,    0,   0 ],
                               [9,    10,  0,   11,  12,   0 ],
                               [13,   14,  0,   15,   6,   0 ],
                               [0,     0,  0,   0,    0,   0 ]])

使用np.insert

import numpy as np
a_obtained = np.array( [[1,     2,   3,    4   ],
                        [5,     6,   7,    8   ],
                        [9,    10,   11,  12   ],
                        [13,   14,   15,   16  ]])
                        
new_row = np.zeros(4)
a_obtained = np.insert(a_obtained, [3, 4], [new_row], axis= 0)
print(a_obtained)

如果我们有所需的列索引,可以通过 np.insert 完成:

desired_cols_ids = np.array([2, 4], dtype=np.int64)

zero_arr_row = np.zeros((1, a_obtained.shape[1]))
# [[0. 0. 0. 0.]]

a_obtained = np.insert(a_obtained, desired_cols_ids, zero_arr_row, axis=0)
# [[ 1  2  3  4]
#  [ 5  6  7  8]
#  [ 0  0  0  0]
#  [ 9 10 11 12]
#  [13 14 15 16]
#  [ 0  0  0  0]]

zero_arr_col = np.zeros((a_obtained.shape[0], 1))
# [[0.]
#  [0.]
#  [0.]
#  [0.]
#  [0.]
#  [0.]]

a_obtained = np.insert(a_obtained, desired_cols_ids, zero_arr_col, axis=1)
# [[ 1  2  0  3  4  0]
#  [ 5  6  0  7  8  0]
#  [ 0  0  0  0  0  0]
#  [ 9 10  0 11 12  0]
#  [13 14  0 15 16  0]
#  [ 0  0  0  0  0  0]]

稍微解释一下,首先,我们将行插入到数组中(因此它被修改)然后插入到修改后的数组的列中。

np.insert 相对容易用于此任务,但它在内部使用多种方法,具体取决于插入规范。对于这种情况,我怀疑它会执行以下操作:

从“空白”数组开始:

In [51]: res = np.zeros((6,6),a_obtained.dtype)

为我们要添加行和列的位置创建一个布尔掩码。在这里,我可以同时处理行和列(而不是使用 2 insert 调用):

In [52]: mask = res.astype(bool)
In [53]: mask[[2,5]] = True
In [54]: mask[:,[2,5]] = True
In [55]: mask
Out[55]: 
array([[False, False,  True, False, False,  True],
       [False, False,  True, False, False,  True],
       [ True,  True,  True,  True,  True,  True],
       [False, False,  True, False, False,  True],
       [False, False,  True, False, False,  True],
       [ True,  True,  True,  True,  True,  True]])

然后只需添加原始值即可。布尔掩码选择一个“平面”数组,因此 a_obtained 也必须展平。否则插入是直的。

In [56]: res[~mask] = a_obtained.ravel()
In [57]: res
Out[57]: 
array([[ 1,  2,  0,  3,  4,  0],
       [ 5,  6,  0,  7,  8,  0],
       [ 0,  0,  0,  0,  0,  0],
       [ 9, 10,  0, 11, 12,  0],
       [13, 14,  0, 15, 16,  0],
       [ 0,  0,  0,  0,  0,  0]])