【问题标题】:Create numpy array from generator, list of lists从生成器创建 numpy 数组,列表列表
【发布时间】:2020-04-28 16:47:24
【问题描述】:

我正在尝试将生成器转换为 numpy 数组。我在数据列表上应用了一个 map 函数,结果是一个生成器。我尝试做 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.

【问题讨论】:

  • 请发布 MCVE
  • 好的。我会尽快编辑帖子。

标签: python-3.x numpy generator


【解决方案1】:

要使用复合 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)

【讨论】:

  • 谢谢!所以它并没有我想象的那么快。
  • 当您将多个串在一起时,生成器最有用。它们会延迟评估,但迟早您必须生成所有值。
猜你喜欢
  • 2023-03-09
  • 2018-01-24
  • 1970-01-01
  • 2020-04-03
  • 1970-01-01
  • 2011-01-07
  • 2020-06-14
  • 2017-02-19
  • 2022-01-16
相关资源
最近更新 更多