繁体   English   中英

同时对一维数组和二维数组排序(按列)

[英]Sort a 1D array and a 2D array(by column) simultaneously

我有两个数组,一个名为Amplitudes(形状为(99,))的一维数组和一个名为Modes(形状为(55714,99))的2D数组。 我想对这两个数组进行排序,以使Modes数组的列根据Amplitudes进行排列。 这样做实际上是为了找到主导模式。

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)。

有没有办法进行这种分类?

你很亲近 第一种方法可以通过转置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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM