如何保存具有生成器提供的所有样本的某些特定元素的numpy数组?

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

假设我有一个生成元组x,y的生成器。我只想保存从此生成器产生的所有x元素。但是,我想使用.npy文件来这样做。

[我知道,如果我的生成器每次迭代仅产生一个元素,比方说z,我可以使用以下代码将该元素保存在numpy数组文件中。

numpy.save('array.npy', numpy.stack(generator))

但是,我不知道如何修改此行来解决我的问题。我的意思是,我认为无法使用此功能。

请您能帮帮我吗?我真的很感激任何帮助:)谢谢!

python python-3.x numpy generator
1个回答
0
投票

生成器:

In [406]: g = ((i,i+10) for i in range(5))                                               

一个数组:

In [407]: arr = np.stack(g)                                                              
/usr/local/lib/python3.6/dist-packages/IPython/core/interactiveshell.py:3242: 
FutureWarning: arrays to stack must be passed as a "sequence" 
type such as list or tuple. Support for non-sequence iterables 
such as generators is deprecated as of NumPy 1.16 and will raise 
an error in the future.
    if (await self.run_code(code, result,  async_=asy)):
In [408]: arr                                                                            
Out[408]: 
array([[ 0, 10],
       [ 1, 11],
       [ 2, 12],
       [ 3, 13],
       [ 4, 14]])

第一列:

In [409]: arr[:,0]                                                                       
Out[409]: array([0, 1, 2, 3, 4])

或将fromiter与复合dtype一起使用以构成结构化数组:

In [410]: g = ((i,i+10) for i in range(5))                                               
In [411]: arr = np.fromiter(g, 'i,i')                                                    
In [412]: arr                                                                            
Out[412]: 
array([(0, 10), (1, 11), (2, 12), (3, 13), (4, 14)],
      dtype=[('f0', '<i4'), ('f1', '<i4')])
In [413]: arr['f0']                                                                      
Out[413]: array([0, 1, 2, 3, 4], dtype=int32)

通过在生成器中列出列表来避免警告:

In [414]: g = ((i,i+10) for i in range(5))                                               
In [415]: np.array(list(g))                                                              
Out[415]: 
array([[ 0, 10],
       [ 1, 11],
       [ 2, 12],
       [ 3, 13],
       [ 4, 14]])

稍后,您必须“实例化”生成器。生成器仅在多个链接在一起时才保存内存。 numpy数组存储所有值,而不是生成器或其“潜在”值。因此,当最终目标是数组时,生成器并没有那么有用。

© www.soinside.com 2019 - 2024. All rights reserved.