2014-09-29 172 views
1

我有兩個數組,一個叫做形狀爲(99,)的幅度的一維數組和一個叫做具有形狀模式(55714,99)的二維數組。我想對這兩個數組進行排序,使得Modes數組的列根據幅度進行排列。這實際上是爲了找到占主導地位的模式而完成的。同時對一維數組和二維數組排序(按列)

Amplitudes_absolute是我的一維數組,Modes_st是我的二維數組。兩者都是未分類的。

Amplitudes_absolute.shape給出(99) Modes_st.shape給我(55714,99)

我想保留排序方式的形狀(55714,99),但與列排序根據Amplitude_absolute的遞增值。

我想:

Amplitudes_absolute_sorted, Modes_sorted = [list(x) for x in  zip(*sorted(zip(Amplitudes_absolute, Modes_st), key=itemgetter(0)))] 

Modes_sorted = np.squeeze(np.array(Modes_sorted)) #To obtain an array 

Amplitudes_absolute_sorted = np.sort(Amplitudes_absolute) 

p = Amplitudes_absolute_sorted.argsort() 

Modes_sorted = Modes_st[p] 

兩個給我的錯誤的形狀,如Modes_sorted.shape給出(99,99),而不是(55714,99)。

有沒有辦法做到這一點排序?

回答

1

你非常接近。第一種方法可以固定通過轉置modes陣列:

from operator import itemgetter 
import numpy as np 

_, modes_sorted = zip(*sorted(zip(amplitudes, modes.T), key=itemgetter(0))) 
modes_sorted = np.array(modes_sorted) 

這是因爲當你遍歷一個二維數組numpy的你行,但你需要的列。您只獲得了具有原始代碼的前99行,因爲zip會在其接收到的其中一個迭代器耗盡時停止。

當然與numpy的它更容易做到:

sorter = amplitudes.argsort() 
modes_sorted = modes[:,sorter] 

注意:爲第一指標,所以我們重新安排列,而不是行。此外,首先不需要對amplitudes進行排序,您可以直接使用argsort

+0

完美的作品! Dankeschön! – 2014-09-30 08:43:02