【问题标题】:Using NumPy argsort and take in 2D arrays使用 NumPy argsort 并接收二维数组
【发布时间】:2013-05-16 19:55:11
【问题描述】:

目的是计算两组点(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

【问题讨论】:

    标签: python arrays sorting numpy distance


    【解决方案1】:

    截至 2018 年 5 月,np.take_along_axis

    s2 = np.take_along_axis(dist, a, axis=1)
    

    【讨论】:

      【解决方案2】:

      我认为没有办法使用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]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-10-17
        • 1970-01-01
        • 2017-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多