我刚刚开始使用NumPy,所以我可能会错过一些核心概念......
从值为列表的字典创建NumPy数组的最佳方法是什么?
像这样的东西:
d = { 1: [10,20,30] , 2: [50,60], 3: [100,200,300,400,500] }
应该变成这样的东西:
data = [ [10,20,30,?,?], [50,60,?,?,?], [100,200,300,400,500] ]
我将对每一行做一些基本的统计,例如:
deviations = numpy.std(data, axis=1)
问题:
从字典中创建numpy.array的最佳/最有效方法是什么?字典很大; 几百万把钥匙,每件钥匙约有20件.
每个'行'的值的数量是不同的.如果我理解正确numpy想要统一大小,那么我为缺少的项目填写什么让std()开心?
更新:有一件事我忘了提及 - 虽然python技术是合理的(例如,循环几百万个项目很快),但它仅限于一个CPU.Numpy操作可以很好地扩展到硬件并击中所有CPU,因此它们很有吸引力.
您不需要创建numpy数组来调用numpy.std().您可以在循环中调用numpy.std()覆盖字典的所有值.该列表将动态转换为numpy数组以计算标准变化.
这个方法的缺点是主循环将在python中而不是在C中.但我想这应该足够快:你仍然会以C速度计算std,并且你将节省大量内存,因为你不会必须在有可变大小数组的地方存储0个值.
如果要进一步优化它,可以将值存储到numpy数组列表中,这样就可以只进行一次python list - > numpy数组转换.
如果你发现这仍然太慢,尝试使用psycho来优化python循环.
如果这仍然太慢,请尝试将Cython与numpy模块一起使用.本教程声称图像处理的速度提升令人印象深刻.或者简单地在Cython中编写整个std函数(有关sum函数的基准和示例,请参阅此内容)
Cython的替代方案是将SWIG与numpy.i一起使用.
如果你只想使用numpy并且在C级别计算所有内容,请尝试将相同大小的所有记录分组在不同的数组中,并在每个数组上调用numpy.std().它应该类似于以下示例.
O(N)复杂度的示例:
import numpy list_size_1 = [] list_size_2 = [] for row in data.itervalues(): if len(row) == 1: list_size_1.append(row) elif len(row) == 2: list_size_2.append(row) list_size_1 = numpy.array(list_size_1) list_size_2 = numpy.array(list_size_2) std_1 = numpy.std(list_size_1, axis = 1) std_2 = numpy.std(list_size_2, axis = 1)