压缩numpy数组的有效方法(python)

压缩numpy数组的有效方法(python),python,filter,numpy,compression,Python,Filter,Numpy,Compression,我正在寻找一种压缩numpy数组的有效方法。 我有一个类似这样的数组:dtype=[(name,(np.str,8),(job,(np.str,8),(income,np.uint32)](我最喜欢的例子) 如果我在做这样的事情:my_array.compress(my_array['income']>10000)我得到了一个新的数组,它只有incomers>10000,而且速度非常快 但若我想过滤列表中的作业:它不起作用 my__array.compress(m_y_array['job']

我正在寻找一种压缩numpy数组的有效方法。 我有一个类似这样的数组:
dtype=[(name,(np.str,8),(job,(np.str,8),(income,np.uint32)]
(我最喜欢的例子)

如果我在做这样的事情:
my_array.compress(my_array['income']>10000)
我得到了一个新的数组,它只有incomers>10000,而且速度非常快

但若我想过滤列表中的作业:它不起作用

my__array.compress(m_y_array['job'] in ['this', 'that'])
错误:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
所以我必须这样做:

np.array([x for x in my_array if x['job'] in ['this', 'that'])
这既丑陋又低效


你有没有办法提高效率?

虽然没有你想要的那么好,但我认为你可以做到:

mask = my_array['job'] == 'this'
for condition in ['that', 'other']:
  mask = numpy.logical_or(mask,my_array['job'] == condition)
selected_array = my_array[mask]

如果你在寻找一个唯一的解决方案,我想你不会得到它。尽管它在封面下做了大量的工作,但是考虑一下这个包是否能以一个“不那么难看”的方式来做你想做的事情。我不确定你会得到更多的“高效”而不用自己写一个C扩展。 顺便说一句,我认为这对于任何真实的案例来说都足够有效和漂亮

my_array.compress([x in ['this', 'that'] for x in my_array['job']])

作为一个额外的步骤,使它不那么难看,效率更高,你大概不会在中间有一个硬编码的列表,所以我会用一个集合来代替,因为如果列表中有超过几个项:搜索速度比列表快得多:

job_set = set(['this', 'that'])
my_array.compress([x in job_set for x in my_array['job']])

如果您认为这不够有效,我建议您进行基准测试,这样您就有信心在努力提高效率的同时明智地花费时间。

压缩numpy数组的最佳方法是使用pytables。这是处理大量数字数据的实际标准

import tables as t
hdf5_file = t.openFile('outfile.hdf5')
hdf5_file.createArray ......
hdf5_file.close()

谢谢!不是纯粹的numpy,但确实非常有效和足够;)我把列表作为一个元组,它也很好(还没有基准测试…)据我所知,下面所有的解决方案都涉及到制作数组的副本(用于掩码)。因此,没有一个是真正有效的IMHO。