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

Python 使用索引和布尔选择后更新2D矩阵上的值,python,numpy,Python,Numpy,我有一个矩阵来存储N个元素的k个最小距离。每当一个新元素到达时,我想计算到所有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])我必须计算到所有元素的距离,如果它小于当时存储的最大距离,

我有一个矩阵来存储N个元素的k个最小距离。每当一个新元素到达时,我想计算到所有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\u min\u dists
矩阵上的值,我找不到解决方案


非常感谢

center\u mindsists[id0,max\u min\u idx]
是一个副本,因为索引不是切片(基本索引)

修改该副本,而不是原始副本,因此不会发生任何事情

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

center_mindists[idx0, idx1] = ....

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

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\u idx
掩码。

您正在尝试运行K-最近邻吗?你可以将其矢量化。索引索引索引而不是数组。我认为一些类似于中心思维者[id0[lower\u idx],max\u min\u idx]=距离[lower\u idx[0]]的东西。当您以另一种方式执行此操作时,不可避免地必须创建临时副本以满足奇特的索引,因此分配的数据会被破坏。
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