gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:55:07 30 4
gpt4 key购买 nike

我刚开始使用 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 的最好/最有效的方法是什么?字典很大;几百万个 key ,每个 key 大约有 20 个项目。

  • 每个“行”的值数量不同。如果我理解正确,numpy 需要统一大小,那么我应该为缺少的项目填写什么以使 std() 满意?

更新:有一件事我忘了提——虽然 python 技术是合理的(例如,循环几百万个项目很快),但它仅限于单个 CPU。 Numpy 操作可以很好地扩展到硬件并使用所有 CPU,因此它们很有吸引力。

最佳答案

您不需要创建 numpy 数组来调用 numpy.std()。您可以在字典的所有值上循环调用 numpy.std() 。该列表将动态转换为 numpy 数组以计算标准差。

这种方法的缺点是主循环将在 python 中而不是在 C 中。但我想这应该足够快:你仍然会以 C 速度计算 std,并且你会节省大量内存不必在具有可变大小数组的地方存储 0 值。

  • 如果您想进一步优化它,您可以将您的值存储到一个 numpy 数组列表中,这样您只需执行一次 python 列表 -> numpy 数组转换。
  • 如果您发现这仍然太慢,请尝试使用 psycho 来优化 python 循环。
  • 如果仍然太慢,请尝试使用 Cython连同 numpy 模块。这Tutorial声称图像处理速度有了显着提高。或者简单地在 Cython 中编写整个 std 函数(参见 this 以获取基准和 sum 函数示例)
  • Cython 的替代方法是使用 SWIGnumpy.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)

关于python - 从字典创建 NumPy 数组的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/601477/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com