鑒于我有兩個陣列:
array1 = np.array([np.nan,np.nan,np.nan,np.nan,2,np.nan,1,np.nan,np.nan,5,np.nan,np.nan,6,np.nan,10,9,np.nan])
array2 = np.array([np.nan,np.nan,np.nan,np.nan,45,np.nan,33,np.nan,np.nan,32,np.nan,np.nan,44,np.nan,10,53,np.nan])
我想讓 array2 以具有相同 nan 序列的 array1 元素的升序排序:
[np.nan,np.nan,np.nan,np.nan,32,np.nan,10,np.nan,np.nan,33,np.nan,np.nan,44,np.nan,53,45,np.nan]
似乎我可以使用
np.argsort(array1)=[ 6 4 9 12 15 14 0 13 11 10 8 5 3 2 1 7 16]如果有一個命令來移動 array2 中的元素,例如:將索引為“6”的元素放在第一個而不是 nan 位置等
有任何想法嗎?
UPD1:我發布了一個相關問題How to replace element of a numpy array from two different arrays for a case when we have to split the array to reordering
uj5u.com熱心網友回復:
洗掉 NaN,排序,添加 NaN。
from operator import itemgetter
#remove NaN
a = [x for x in array1 if not np.isnan(x)]
b = [y for y in array2 if not np.isnan(y)]
# a == [2.0, 1.0, 5.0, 6.0, 10.0, 9.0]
# b == [45.0, 33.0, 32.0, 44.0, 10.0, 53.0]
# sort
c = map(itemgetter(1), sorted(zip(a, b)))
# list(c) == [33.0, 45.0, 32.0, 44.0, 53.0, 10.0]
# add NaN
d = [(np.nan if np.isnan(x) else next(c)) for x in array1]
# d == [nan, nan, nan, nan, 33.0, nan, 45.0, nan, nan, 32.0, nan, nan, 44.0, nan, 53.0, 10.0, nan]
請注意,Akshay Sehgal 的答案中的建議可能比我的更快,因為它直接使用 numpy 而不是 python 串列和迭代器。
uj5u.com熱心網友回復:
您可以通過覆寫非 nan 元素的第二個陣列的視圖來使用 numpy 執行此操作。
idx = array1[~np.isnan(array1)].argsort()
array2[~np.isnan(array2)] = array2[~np.isnan(array2)][idx]
array2
array([nan, nan, nan, nan, 33., nan, 45., nan, nan, 32., nan, nan, 44.,
nan, 53., 10., nan])
另一種“更干凈”的方法是按原樣對陣列進行排序,洗掉 nans,然后像前面的方法一樣覆寫 array2 的視圖。
ordered = array2[array1.argsort()]
ordered = ordered[~np.isnan(ordered)]
array2[~np.isnan(array2)] = ordered
array2
array([nan, nan, nan, nan, 33., nan, 45., nan, nan, 32., nan, nan, 44.,
nan, 53., 10., nan])
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/312306.html
