我想创建一个数组的结构:
[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
)
与相比
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处理能力、矢量化处理、排序速度等(?有没有其他解决方案可以推荐?
我对几种数组类型进行了一些性能测试。我的测试结果可以作为这个主题的答案:
ndarray比recarray访问快吗
(忽略对我问题的反对票。显然有人不喜欢我的提问方式。(
简短的版本:从掩码数组中提取数据比在ndarray上执行相同操作慢得多。结构化数组和重数组的访问时间比ndarray慢,但都是几分之一秒。很明显,使用屏蔽数组时会有开销(可能类似于记录数组?(。这里有一个很好的讨论数组类型之间的差异:
numpy讨论:结构化数组重数组和记录数组
还有其他限制。例如,许多(大部分/全部(numpy矩阵和数学运算都限于ndarrays(需要相同的数据类型(。我不认为这些适用于您的情况,因为您使用的是像表一样的结构化数组。