Python Numpy:结构化数组与相同数据类型数组的运行成本

时间:2018-11-14 23:19:53

标签: python arrays numpy

我想创建一个结构数组的数组:

[line_number,count,temperature,humidity,sensor1_on,sensor2_on]

其中前两个需要为uint32,温度和湿度可以为uint8,而sensor_on的类型可以为bool

稍后,我需要根据line_number的组合对2d数组进行排序,然后计数。我还需要对所有温度和湿度数据的列表分别进行平均值和其他统计计算。

我发现了便于数据存储和检索的结构化数组:

np_data=np.zeros([num_lines],
                          dtype='uint32,'#Line No
                                'uint32,'# Count
                                'uint8,' #TEMP
                                'uint8,' #HUMID
                                'bool,' #S1 On
                                'bool'#S2 On
                          )

为此vs

np_data=np.zeros([num_lines,5],dtype='uint32') 
# I would pack my bools into the last uint32 and then unpack later 
# but it seems like a waste of space

通过创建结构化数组与具有所有相同数据类型的结构化数组,我是否会失去任何东西(numpy处理能力,矢量化处理,排序速度等)?有其他建议的解决方案吗?

1 个答案:

答案 0 :(得分:1)

我对几种阵列类型进行了性能测试。我的测试结果可以作为此主题的答案:
is ndarray faster than recarray access?
(忽略我的问题的否决票。显然有人不喜欢我的要求。)

简短的版本:从掩码数组中提取数据比对ndarray进行相同操作要慢得多。结构化数组和Recarray的访问时间比ndarray慢,但都只有几分之一秒。显然,使用掩码数组(可能与记录数组类似)会产生开销。这里对数组类型之间的区别进行了很好的讨论:
numpy-discussion:structured-arrays-recarrays-and-record-arrays

还有其他限制。例如,许多(大多数/全部)numpy矩阵和数学运算仅限于ndarray(需要相同的数据类型)。我认为这些不适用于您的情况,因为您使用的是像表一样的结构化数组。