使用索引和布尔选择后更新2D矩阵的值

时间:2018-05-15 05:21:39

标签: python numpy

我有一个矩阵来存储 k N个元素的最小距离。每当新元素到达时,我想计算到所有N个元素的距离,如果任何距离低于存储的最大距离,我想更新该值并存储新距离。最初距离设置为np.inf

elems = np.array([[5, 5],[4, 4],[8, 8]])
k=2
center_mindists = np.full((len(elems),k), np.inf)

所以当一个新元素到来时,让我们说x=np.array([1,1])我必须计算到所有元素的距离并存储它,如果它小于当时存储的最大距离

distances = np.sum(np.abs(elems - x)) #[8 6 14]

为此,我找到每行中有最大距离的索引,然后选择最近计算距离的最大存储距离

max_min_idx = np.argmax(center_mindists, axis=1) #[0 0 0]
id0 = np.indices(max_min_idx.shape)
lower_id = distances < centers_mindists[id0, max_min_idx]

最后,我必须用新的值更新这些值:

center_mindists[id0, max_min_idx][lower_idx] = distances[lower_idx[0]]

问题是分配不会改变center_min_dists矩阵上的值,我也找不到解决方案。

非常感谢!!

2 个答案:

答案 0 :(得分:1)

center_mindists[id0, max_min_idx]是副本,因为索引不是切片(基本索引)。

center_mindists[id0, max_min_idx][lower_idx] = ...

修改该副本,而不是原始副本,因此不会发生任何结果。

您必须以某种方式组合索引,以便您只有一组高级索引

center_mindists[idx0, idx1] = ....

答案 1 :(得分:1)

您可以分两步执行分配,因为您有一个双索引,其中第一部分是副本。而不是

center_mindists[id0, max_min_idx][lower_idx] = distances[lower_idx[0]]

显式更新副本,并将其分配回来:

temp = center_mindists[id0, max_min_idx]
temp[lower_idx] = distances[lower_idx[0]]
center_mindists[id0, max_min_idx] = temp

这实际上非常方便,因为您确实首先使用temp来计算lower_idx掩码。