python-3.x - 从生成器创建 numpy 数组,列表列表

标签 python-3.x numpy generator

我正在尝试将生成器转换为 numpy 数组。我在数据列表上应用映射函数,结果是一个生成器。我尝试执行 list(map()) 然后创建 numpy 向量,但需要很长时间。我在某处看到可以直接使用 np.fromiter 从生成器创建 numpy 向量。但是,我遇到了这个错误:

ValueError: setting an array element with a sequence.

我发现错误出现是因为我的生成器生成了一个列表列表。例如:[[1,2,3], [4,5,6]],我应该为 fromiter()< 使用正确的结构 dtype/ 功能。我找不到执行此操作的正确方法的解释。你能帮助我吗?

这是一个完整的示例:

import numpy as np

def foo(bar):
  return [bar] * 3 # so for 4 it returns [4,4,4], ..

a = [1,2,3,4,5,6,7]
b = map(foo,a)
c = np.fromiter(b, int) # this doesn't work.

最佳答案

要使用复合dtype,函数必须返回元组,而不是列表

In [977]: def foo(bar): 
     ...:   return (bar,) * 3 # so for 4 it returns [4,4,4], .. 
     ...:  
     ...: a = [1,2,3,4,5,6,7] 
     ...: b = map(foo,a)                                                                               
In [978]: list(b)                                                                                      
Out[978]: [(1, 1, 1), (2, 2, 2), (3, 3, 3), (4, 4, 4), (5, 5, 5), (6, 6, 6), (7, 7, 7)]
In [979]: def foo(bar): 
     ...:   return (bar,) * 3 # so for 4 it returns [4,4,4], .. 
     ...:  
     ...: a = [1,2,3,4,5,6,7] 
     ...: b = map(foo,a)                                                                               
In [980]: np.fromiter(b, 'i,i,i')                                                                      
Out[980]: 
array([(1, 1, 1), (2, 2, 2), (3, 3, 3), (4, 4, 4), (5, 5, 5), (6, 6, 6),
       (7, 7, 7)], dtype=[('f0', '<i4'), ('f1', '<i4'), ('f2', '<i4')])

一些时间安排:

In [981]: %%timeit b = map(foo,a) 
     ...: np.array(list(b)) 
     ...:  
     ...:                                                                                              
1.9 µs ± 55.2 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
In [982]: %%timeit b = map(foo,a) 
     ...: np.fromiter(b, 'i,i,i') 
     ...:  
     ...:                                                                                              
17.2 µs ± 9.72 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

关于python-3.x - 从生成器创建 numpy 数组,列表列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61485507/

相关文章:

typescript - 为什么 TypeScript 的 IterableIterator<> 和 Generator<> 泛型略有不同?

Python - 为什么这段代码被认为是一个生成器?

python - 将面板数据 reshape 为数据框 pandas

python-3.x - 从父级继承时如何更改 pydantic 小于或等于验证

python - pandas 创建一个列并从字典中为其赋值

python - 用numpy数组离散化路径并且点之间的距离相等

python-3.x - Python : Issues downloading file from google drive api, 超出未经身份验证的使用的每日限制

python - 在 numpy 中向量化简单的 for 循环

python - matplotlib 等高线图 : proportional colorbar levels in logarithmic scale

android - 如何生成一定范围内的随机数?