一个算法要求我在一个方阵中添加一个额外的变量,这会导致在矩阵中添加一行和一列。我可以使用np.insert方法,如下所示,但想知道是否有更好的方法来对已经存在的分配数组执行此操作?
我试着玩了一个蒙面写,但没有成功:
import numpy as np
m1 = np.array([[1,3,4,5],
[11,13,14,15],
[16,18,19,20],
[21,23,24,25]
])
row_1 = np.array([6,8,9,10])
col_1 = np.array([2,7,12,17,22])
m2 = np.insert(m1, 1, row_1, axis=0)
m2 = np.insert(m2, 1, col_1, axis=1)
print(f'{m2=}')
# create a mask to copy data from m1
m1_mask = np.ones(tuple(np.array(m1.shape) + 1), dtype=int)
expanded_m1 = np.zeros(tuple(np.array(m1.shape) + 1))
m1_mask[:,1] = 0
m1_mask[1, :] = 0
print(m1_mask)
# only write the indices where there are 1's from the original m1 data
expanded_m1[m1_mask] = m1
print(expanded_m1)
2条答案
按热度按时间6za6bjd01#
您的
expanded_m1[m1_mask] = m1
失败,因为LHS引用(5, 5, 5)
数组。如果你把
m1_mask
作为一个布尔型数组,并在其定义中加上dtype=bool
,它就变成了一个掩码。在设置了m1_mask[:, 1] = 0
和m1_mask[1, :] = 0
之后,我们得到了m1_mask
:然后,
expanded_m1[m1_mask]
返回元素的 vector,因为它无法知道结果实际上是一个非不规则数组。如果您还展平
m1
,则可以设置这些元素:然后,您可以设置新的行和列。需要一些技巧,因为
row
只有四个元素,但这很容易处理:然而,这并没有明显更快。考虑下面的图表,该图表显示了
np.insert
方法与掩码方法以及显式设置新数组的每个“片段”(如Kelly shows in their answer)的性能比较。手动设置所有内容而不是创建掩码会快2倍。svmlkihl2#
另一个: