假設我有一個 NumPy 陣列:
[[7 2]
[7 3]
[2 8]
[4 3]
[5 5]]
其中第 0 個索引是 x 值,第 1 個索引是 y 值。如何對這些值進行排序,以便在將它們放入函式時: (x^2 y- 11)^2 (x y^2 -7)^2,它們會根據結果按升序排序? 所以排序后的值看起來像這樣:
[[4 3]
[5 5]
[7 2]
[7 3]
[2 8]]
陣列可以有重復。
我的想法之一是使用 .argsort() 方法,盡管我不知道如何實作它。
謝謝!
uj5u.com熱心網友回復:
您可以沿第一個軸應用您擁有的函式,以獲得具有函式值的一維陣列。將該結果傳遞np.argsort()給您將為您提供正確的排序索引:
a = np.array([
[7, 2],
[7, 3],
[2, 8],
[4, 3],
[5, 5]]
)
def my_func(row):
x, y = row
return (x ** 2 y - 11) ** 2 (x y ** 2) ** 2
f = np.apply_along_axis(my_func, 1, a)
# array([1721, 1937, 4357, 233, 1261])
indices = np.argsort(f)
# array([3, 4, 0, 1, 2])
a[indices]
# array([[4, 3],
# [5, 5],
# [7, 2],
# [7, 3],
# [2, 8]])
根據@mozway 的評論...這顯著更快,因為它允許 Numpy 對函式進行矢量化:
x,y = a.T
aa = (x ** 2 y - 11) ** 2 (x y ** 2) ** 2
indices = np.argsort(aa)
a[indices]
結果相同。
uj5u.com熱心網友回復:
所以這有效:
def f(x, y):
return (x**2 y- 11)**2 (x y**2 -7)**2
def sortTuples(TupleList):
output = [0, 0, 0, 0, 0]
indexList = []
for i in TupleList:
x = i[0]
y = i[1]
indexList.append(f(x, y))
indexList.sort()
for i in TupleList:
output[indexList.index(f(i[0], i[1]))] = i
return output
希望你找到一個更好的方法來做到這一點!
uj5u.com熱心網友回復:
至少對于小型陣列,與 ,sorted具有競爭力np.argsort(特別是如果串列足以滿足您的任務):
out = sorted(arr.tolist(), key=lambda x: (x[0]**2 x[1]-11)**2 (x[0] x[1]**2-7)**2)
輸出:
[[4, 3], [5, 5], [7, 2], [7, 3], [2, 8]]
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/397944.html
