我有一个矩阵来存储 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
矩阵上的值,我也找不到解决方案。
非常感谢!!
答案 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
掩码。