根据元素的条件值对 numpy 数组元素进行排序
sort numpy array elements by the value of a condition on the elements
我需要通过增加与另一个点的距离来对 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)到 return arr,每个元素从接近 [i,j] 的程度从低到高排序。有人对此有快速解决方案吗?
我想要的输出是new_arr = np.array([[1,2],[0,0],[4,1]])
我有一些想法,但它们看起来效率极低。
谢谢!
似乎有两种方法可以做到这一点:
将整个numpy数组转换为Python列表,并使用Python的排序方法对它进行排序
l = list(arr)
l.sort(key=lambda coord: dist(1, 1, coord[0], coord[1]))
arr = np.array(l)
通过在原始数组上映射 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]
实际上,您可以通过使用 numpy.lexsort()、使用以 dist() 映射的 arr 作为键,然后应用结果,从而使 @user3030010 的第二个答案更有效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]
这确实是一个小改进,但如果您随后添加更多键进行排序,该方法将特别有用。
我需要通过增加与另一个点的距离来对 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)到 return arr,每个元素从接近 [i,j] 的程度从低到高排序。有人对此有快速解决方案吗?
我想要的输出是new_arr = np.array([[1,2],[0,0],[4,1]])
我有一些想法,但它们看起来效率极低。
谢谢!
似乎有两种方法可以做到这一点:
将整个numpy数组转换为Python列表,并使用Python的排序方法对它进行排序
l = list(arr) l.sort(key=lambda coord: dist(1, 1, coord[0], coord[1])) arr = np.array(l)
通过在原始数组上映射
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]
实际上,您可以通过使用 numpy.lexsort()、使用以 dist() 映射的 arr 作为键,然后应用结果,从而使 @user3030010 的第二个答案更有效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]
这确实是一个小改进,但如果您随后添加更多键进行排序,该方法将特别有用。