我在一個陣列中有這樣的資料:
array([[ 5, 5, 5, 6, 9, 6, 6],
[10, 4, 10, 3, 5, 3, 3],
[10, 3, 10, 4, 5, 3, 4],
[ 9, 6, 8, 8, 10, 6, 9],
[10, 10, 10, 7, 10, 4, 4],
[10, 6, 10, 5, 9, 7, 5],
[ 9, 7, 10, 7, 10, 8, 10],
[ 8, 5, 10, 7, 10, 7, 10],
[ 7, 10, 10, 9, 10, 7, 8]])
我想按非 10 值的數量對其進行排序,并且我還想按行的升序和 10 的數量的降序對其進行排序:
arr = np.sort(arr, axis=1)
arr = arr[(arr==10).sum(axis=1).argsort()][::-1]
輸出:
array([[ 4, 4, 7, 10, 10, 10, 10],
[ 7, 7, 8, 9, 10, 10, 10],
[ 5, 7, 7, 8, 10, 10, 10],
[ 7, 7, 8, 9, 10, 10, 10],
[ 5, 5, 6, 7, 9, 10, 10],
[ 3, 3, 4, 4, 5, 10, 10],
[ 3, 3, 3, 4, 5, 10, 10],
[ 6, 6, 8, 8, 9, 9, 10],
[ 5, 5, 5, 6, 6, 6, 9]])
我想實作一個決勝局系統,如果 10s 的數量相同,它現在按 9s 的數量排序,然后是 8s,依此類推。預期輸出:
array([[ 4, 4, 7, 10, 10, 10, 10],
[ 7, 7, 8, 9, 10, 10, 10],
[ 7, 7, 8, 9, 10, 10, 10],
[ 5, 7, 7, 8, 10, 10, 10],
[ 5, 5, 6, 7, 9, 10, 10],
[ 3, 3, 4, 4, 5, 10, 10],
[ 3, 3, 3, 4, 5, 10, 10],
[ 6, 6, 8, 8, 9, 9, 10],
[ 5, 5, 5, 6, 6, 6, 9]])
uj5u.com熱心網友回復:
您可以使用numpy.frompyfunc.
基本思想是構造一個行數相同的陣列,每個元素是一個元組,包含10、9等的個數。然后應用numpy.argsort到這個陣列上,得到結果。
import numpy as np
arr = np.array([[ 5, 5, 5, 6, 9, 6, 6],
[10, 4, 10, 3, 5, 3, 3],
[10, 3, 10, 4, 5, 3, 4],
[ 9, 6, 8, 8, 10, 6, 9],
[10, 10, 10, 7, 10, 4, 4],
[10, 6, 10, 5, 9, 7, 5],
[ 9, 7, 10, 7, 10, 8, 10],
[ 8, 5, 10, 7, 10, 7, 10],
[ 7, 10, 10, 9, 10, 7, 8]])
arr = np.sort(arr, 1)
keys = sorted(set(arr.ravel()), reverse=True)
def make_tuple(*argv):
return tuple(argv)
ufunc = np.frompyfunc(make_tuple, len(keys), 1)
cnt_array = ufunc(*[(arr == k).sum(1) for k in keys])
result = arr[cnt_array.argsort()[::-1]]
print(result)
# [[ 4 4 7 10 10 10 10]
# [ 7 7 8 9 10 10 10]
# [ 7 7 8 9 10 10 10]
# [ 5 7 7 8 10 10 10]
# [ 5 5 6 7 9 10 10]
# [ 3 3 4 4 5 10 10]
# [ 3 3 3 4 5 10 10]
# [ 6 6 8 8 9 9 10]
# [ 5 5 5 6 6 6 9]]
uj5u.com熱心網友回復:
在 numpy 中做到這一點的最簡單方法是按決勝局中最不重要的部分進行排序,然后逐步達到最重要的排序標準。
例如,如果您想按 10s 的數量排序,然后按 9s 進行 tie-break,然后按 8s 進行 tie-break,那么您可以這樣做:
arr = np.sort(arr, axis=1)
arr = arr[(arr==8).sum(axis=1).argsort(kind='stable')]
arr = arr[(arr==9).sum(axis=1).argsort(kind='stable')]
arr = arr[(arr==10).sum(axis=1).argsort(kind='stable')]
arr = arr[::-1]
請記住,您需要kind='stable'在每個 argsort 上。這意味著如果一個元素出現在另一個元素之前,并且它們與當前的排序條件相關聯,則將保留順序。默認排序方法快速排序并不穩定。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/529595.html
上一篇:如何提取R資料框中的部分單元格以將它們保存在不同的列中?
下一篇:這個紅寶石函式將回傳什么
