当前位置:  开发笔记 > 编程语言 > 正文

从字典创建NumPy数组的最佳方法?

如何解决《从字典创建NumPy数组的最佳方法?》经验,为你挑选了1个好方法。

我刚刚开始使用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,因此它们很有吸引力.



1> Mapad..:

您不需要创建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)

推荐阅读
贾志军
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有