【问题标题】:sort numpy array elements by the value of a condition on the elements按元素上的条件值对 numpy 数组元素进行排序
【发布时间】:2017-04-20 10:54:44
【问题描述】:

我需要通过增加与另一个点的距离来对一个 numpy 点数组进行排序。

import numpy as np

def dist(i,j,ip,jp): 
    return np.sqrt((i-ip)**2+(j-jp)**2)

arr = np.array([[0,0],[1,2],[4,1]])

我想做的是在定点 [i,j]=[1,1] 和 arr 中的每个有序对 [ip,jp] 之间使用函数 dist(1,1,ip,jp) 返回arr 每个元素从与 [i,j] 的接近度从低到高排序。有人对此有快速解决方案吗?

我想要的输出是 new_arr = np.array([[1,2],[0,0],[4,1]])

我有一些想法,但它们看起来非常低效。

谢谢!

【问题讨论】:

  • 这是一种方式:np.array(sorted(arr, key=lambda x: dist(1,1,x[0], x[1]))).

标签: python arrays sorting proximity


【解决方案1】:

似乎有两种方法可以做到这一点:

  1. 将整个 numpy 数组转换成 Python 列表,并使用 Python 的 sort 方法和 key 函数对其进行排序。

     l = list(arr)
     l.sort(key=lambda coord: dist(1, 1, coord[0], coord[1]))
     arr = np.array(l)
    
  2. 通过将dist() 映射到原始数组来创建第二个numpy 数组,使用.argsort() 获取排序顺序,然后将其应用于原始数组。

     arr2 = np.vectorize(lambda coord: dist(1, 1, coord[0], coord[1]))(arr)
     arr3 = np.argsort(arr2)
     arr = np.array(arr)[arr3]
    

【讨论】:

    【解决方案2】:

    您实际上可以通过使用 numpy.lexsort(),使用映射到 dist() 的 arr 作为键,然后将生成的掩码应用于 arr 本身

    import numpy as np
    
    my_key = np.vectorize(lambda coord: dist(1, 1, coord[0], coord[1]))(arr)
    inds = np.lexsort(keys = [my_key])
    arr = arr[inds]
    

    这确实是一个小改进,但如果您随后添加更多键进行排序,该方法特别有用。

    【讨论】:

      猜你喜欢
      • 2015-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-21
      • 1970-01-01
      • 2019-09-01
      • 2016-02-01
      • 2013-12-03
      相关资源
      最近更新 更多