同时对1D阵列和2D阵列(按列)进行排序

时间:2014-09-29 16:59:35

标签: python arrays sorting simultaneous

我有两个数组,一个名为Amplitudes with shape(99,)的数组和一个名为Modes的二维数组(55714,99)。我想对这两个数组进行排序,使得Modes数组的列根据幅度排列。这实际上是为了找到主导模式。

Amplitudes_absolute是我的1D数组,Modes_st是我的2D数组。两者都未分类。

Amplitudes_absolute.shape给出(99,) Modes_st.shape给了我(55714,99)

我希望将分类模式的形状保留为(55714,99),但是根据Amplitudes_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 个答案:

答案 0 :(得分: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)

这是因为当您迭代2D Numpy数组时,您将获得行,但您需要列。您只获得了原始代码的前99行,因为zip在收到的其中一个迭代器耗尽时停止。

当然,对于Numpy来说,这样做更容易:

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

请注意第一个索引的:,因此我们重新排列列而不是行。此外,无需先排序amplitudes,您可以直接使用argsort