假设我有一个生成元组x,y的生成器。我只想保存从此生成器产生的所有x元素。但是,我想使用.npy文件来这样做。
[我知道,如果我的生成器每次迭代仅产生一个元素,比方说z,我可以使用以下代码将该元素保存在numpy数组文件中。
numpy.save('array.npy', numpy.stack(generator))
但是,我不知道如何修改此行来解决我的问题。我的意思是,我认为无法使用此功能。
请您能帮帮我吗?我真的很感激任何帮助:)谢谢!
生成器:
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数组存储所有值,而不是生成器或其“潜在”值。因此,当最终目标是数组时,生成器并没有那么有用。