2017-02-22 55 views
0

我做的一个傅立叶分析会输出5个数据字段,我已经将其中的每个数据字段收集到一维numpy数组中:freq bin#,幅度,波长,归一化幅度,%功率。如何构建多个python数组进行排序

如何最好地构造数据,以便我可以按降幅进行排序?

如果只用一个数据现场测试,我能够使用的字典如下:

fourier_tuples = zip(range(len(fourier)), fourier) 
fourier_map = dict(fourier_tuples) 
import operator 
fourier_sorted = sorted(fourier_map.items(), key=operator.itemgetter(1)) 
fourier_sorted = np.argsort(-fourier)[:3] 

我的意图是要添加其他阵列线1根,但这既然类型的字典不起作用只接受2个条款。 (这就是为什么this post不能解决我的问题。)

退一步,这是一个合理的方法,还是有更好的方法来组合&排序单独的数组?最终,我想从前3个频率和相关的其他数据中获取数据值,并将它们写入输出数据文件。

这里是我的数据的一个片段:

fourier = np.array([1.77635684e-14, 4.49872050e+01, 1.05094837e+01, 8.24322470e+00, 2.36715913e+01]) 
freqs = np.array([0.  , 0.00246951, 0.00493902, 0.00740854, 0.00987805]) 
wavelengths = np.array([inf, 404.93827165, 202.46913583, 134.97942388, 101.23456791]) 
amps = np.array([4.33257766e-16, 1.09724890e+00, 2.56328871e-01, 2.01054261e-01, 5.77355886e-01]) 
powers% = np.array([4.8508237956526163e-32, 0.31112370227749603, 0.016979224022185751, 0.010445983875848858, 0.086141014686372669]) 

最后4个阵列对应于“傅氏等领域。 (实际的数组长度为42,但为简单起见,减少到5)。

+0

你可以添加一些数据吗?! – Cleb

+1

数组?你的意思是*列表*?你为什么使用'dict',然后简单地调用'items'?这没有任何意义...... –

+0

是'zip(范围(len(fourier)),fourier)'枚举(fourier)''的简称? –

回答

1

您似乎在使用numpy,所以这里是做这件事的方式。你有正确的功能np.argsort在您的文章,但你似乎不正确地使用它:

order = np.argsort(amplitudes) 

这类似于你的字典招只有它计算逆互换相比,你的程序。顺便说一句。为什么要通过字典而不是简单的元组列表?

order内容是现在索引到amplitudesorder所述第一小区中包含的amplitudes最小元件的位置,所述第二小区包含下一等等。因此

top5 = order[:-6:-1] 

提供您的数据中的位置是1D numpy的array是你可以使用top5通过使用高级索引来提取对应于顶部5 ampltiudes元素

freq_bin[top5] 
amplitudes[top5] 
wavelength[top5] 

如果你愿意,你可以将它们一起在列和应用top5所得到的n乘5阵列:

np.c_[freq_bin, amplitudes, wavelength, ...][top5, :] 
+0

我是新来的numpy,只是模仿我在别处看到的方法。我并不感到惊讶,这不是最好的方法。如果元组更明智,那么更好。我创建了如下这样的元组:''''''''''''''我创建了如下所示的元组:'。然后如上创建'top5'并运行'fourier_tuples [top5]'。 结果:“TypeError:只有一个元素的整数数组可以转换为索引” – joechoj

+1

@joechoj我的意思是元组,如果你想沿着原始尝试的方向工作。当你调用'.items()'时,你的字典的键值对被转换为元组,但这样你可以只分组2,并且可以将所有的元组分组。 - 正如我在答案中所述,如果你想使用我的方法,你必须使用numpy数组,因为他们理解高级索引,而元组不会。相当于numpy术语的zip是'np.c _ [...]'最后一行 –

0

如果我理解正确的话,你有相同长度的5个独立的名单,你是试图根据其中之一对所有这些进行排序。要做到这一点,你可以使用numpy或用香草蟒做。这里有两个例子,从头部开始(排序基于第二个列表)。

a = [11,13,10,14,15] 
b = [2,4,1,0,3] 
c = [22,20,23,25,24] 

#numpy solution 
import numpy as np 

my_array = np.array([a,b,c]) 
my_sorted_array = my_array[:,my_array[1,:].argsort()] 

#vanilla python solution 
from operator import itemgetter 

my_list = zip(a,b,c) 
my_sorted_list = sorted(my_list,key=itemgetter(1)) 

然后,您可以用my_sorted_array = np.fliplr(my_sorted_array)翻转数组,如果你愿意,或者如果您正在使用列表您可以与my_sorted_list.reverse()

编辑扭转它在的地方:

为了得到前n值只需要简单地将slice阵列与@Paul所建议的类似。通过指定start:stop:step(您可以省略步骤)参数,切片以与经典列表切片类似的方式完成。在你的情况下,5顶部列将是[:,-5:]。所以在上面的例子中,你可以这样从每一行取前2列:

my_sliced_sorted_array = my_sorted_array[:,-2:] 

结果将是:

array([[15, 13], 
     [ 3, 4], 
     [24, 20]]) 

希望它能帮助。

+0

我喜欢numpy的解决方案,但不能完全使它工作。按照您的建议创建了“my_flipped_array”。数组是否可以被截断以仅包含顶部的x值?虽然也许我不需要那样做,因为结果都可以通过索引访问... – joechoj

+0

啊,谢谢。我一直在尝试'my_flipped_array [:] [:3]',最终以某种方式返回整个数据集。任何想法为什么这不起作用?相比之下,'my_flipped_array [0] [:3]'会返回第一个数组的前3个值。 – joechoj

+0

谁低估了这个答案,你能解释一下吗?这对我来说似乎是一个很好的方法......是否有某些原因会导致我遇到问题?不知何故,@Paul Panzer的答案是否可取? – joechoj

相关问题