gpt4 book ai didi

python - 使用 NumPy argsort 并接收二维数组

转载 作者:太空狗 更新时间:2023-10-30 02:47:14 27 4
gpt4 key购买 nike

目的是计算两组点(set1set2)之间的距离矩阵,使用argsort()得到排序索引和 take() 提取排序数组。我知道我可以直接执行 sort(),但我需要索引才能执行后续步骤。

我正在使用花式索引 concepts discussed here .我无法直接将 take() 与获得的索引矩阵一起使用,但是向每一行添加相应的数量使其工作,因为 take() 使源变平数组使第二行元素具有索引 += len(set2),第三行索引 += 2*len(set2) 等等(见下文):

dist  = np.subtract.outer( set1[:,0], set2[:,0] )**2
dist += np.subtract.outer( set1[:,1], set2[:,1] )**2
dist += np.subtract.outer( set1[:,2], set2[:,2] )**2
a = np.argsort( dist, axis=1 )
a += np.array([[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[10, 10, 10, 10, 10, 10, 10, 10, 10, 10],
[20, 20, 20, 20, 20, 20, 20, 20, 20, 20],
[30, 30, 30, 30, 30, 30, 30, 30, 30, 30]])
s1 = np.sort(dist,axis=1)
s2 = np.take(dist,a)
np.nonzero((s1-s2)) == False
#True # meaning that it works...

主要问题是:是否有一种直接使用take() 而不对这些索引求和的方法?

要玩的数据:

set1 = np.array([[ 250., 0.,    0.],
[ 250., 0., 510.],
[-250., 0., 0.],
[-250., 0., 0.]])

set2 = np.array([[ 61.0, 243.1, 8.3],
[ -43.6, 246.8, 8.4],
[ 102.5, 228.8, 8.4],
[ 69.5, 240.9, 8.4],
[ 133.4, 212.2, 8.4],
[ -52.3, 245.1, 8.4],
[-125.8, 216.8, 8.5],
[-154.9, 197.1, 8.6],
[ 61.0, 243.1, 8.7],
[ -26.2, 249.3, 8.7]])

其他相关问题:

- Euclidean distance between points in two different Numpy arrays, not within

最佳答案

我不认为有一种方法可以在不使用扁平索引的情况下使用 np.take。由于尺寸可能会发生变化,因此您最好为此使用 np.ravel_multi_index,执行如下操作:

a = np.argsort(dist, axis=1)
a = np.ravel_multi_index((np.arange(dist.shape[0])[:, None], a), dims=dist.shape)

或者,您可以在不使用 take 的情况下使用花哨的索引:

s2 = dist[np.arange(4)[:, None], a]

关于python - 使用 NumPy argsort 并接收二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16680334/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com