如何在矩阵 ( 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]])
我是 运行 一个循环,从那里我获得了(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]])