我刚刚开始使用NumPy,所以我可能会错过一些核心概念......
从值为列表的字典创建NumPy数组的最佳方法是什么?
像这样的东西:
d = { 1: [10,20,30] , 2: [50,60], 3: [100,200,300,400,500] }
Run Code Online (Sandbox Code Playgroud)
应该变成这样的东西:
data = [
[10,20,30,?,?],
[50,60,?,?,?],
[100,200,300,400,500]
]
Run Code Online (Sandbox Code Playgroud)
我将对每一行做一些基本的统计,例如:
deviations = numpy.std(data, axis=1)
Run Code Online (Sandbox Code Playgroud)
问题:
从字典中创建numpy.array的最佳/最有效方法是什么?字典很大; 几百万把钥匙,每件钥匙约有20件.
每个'行'的值的数量是不同的.如果我理解正确numpy想要统一大小,那么我为缺少的项目填写什么让std()开心?
更新:有一件事我忘了提及 - 虽然python技术是合理的(例如,循环几百万个项目很快),但它仅限于一个CPU.Numpy操作可以很好地扩展到硬件并击中所有CPU,因此它们很有吸引力.
您不需要创建numpy数组来调用numpy.std().您可以在循环中调用numpy.std()覆盖字典的所有值.该列表将动态转换为numpy数组以计算标准变化.
这个方法的缺点是主循环将在python中而不是在C中.但我想这应该足够快:你仍然会以C速度计算std,并且你将节省大量内存,因为你不会必须在有可变大小数组的地方存储0个值.
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)
Run Code Online (Sandbox Code Playgroud)