从生成器创建numpy数组,列表列表

问题描述 投票:-1回答:1

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

ValueError: setting an array element with a sequence.

我发现错误增加了,因为我的生成器生成了一个列表列表。例如:[[1,2,3], [4,5,6]],我应该为dtype函数使用适当的结构fromiter()。我找不到正确的解释方式。你能帮助我吗?

这是一个完整的例子:

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.
python-3.x numpy generator
1个回答
0
投票

要使用复合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')])
© www.soinside.com 2019 - 2024. All rights reserved.