Python FutureWarning:要堆栈的数组必须作为“传递”;顺序;类型,例如列表或元组。不推荐对非序列可重用项的支持

Python FutureWarning:要堆栈的数组必须作为“传递”;顺序;类型,例如列表或元组。不推荐对非序列可重用项的支持,python,numpy,tensorflow,Python,Numpy,Tensorflow,我正试图将Tensorflow数据集转换为NumPy数组,但收到了一条弃用警告: FutureWarning:要堆栈的数组必须作为“序列”类型(如列表或元组)传递。从NumPy 1.16开始,不推荐对生成器等非序列可重用项的支持,这将在将来引发错误 做这件事的“新”方式是什么 具有numpy 1.18.1和tensorflow 2.1.0的可复制示例: import tensorflow as tf import numpy as np ds = tf.data.Dataset.enumera

我正试图将Tensorflow数据集转换为NumPy数组,但收到了一条弃用警告:

FutureWarning:要堆栈的数组必须作为“序列”类型(如列表或元组)传递。从NumPy 1.16开始,不推荐对生成器等非序列可重用项的支持,这将在将来引发错误

做这件事的“新”方式是什么

具有
numpy 1.18.1
tensorflow 2.1.0
的可复制示例:

import tensorflow as tf
import numpy as np

ds = tf.data.Dataset.enumerate(tf.data.Dataset.range(20, 40))

np.vstack(ds)
我尝试的是:我一次只能用一个维度来做

np.fromiter(ds.map(lambda x, y: x), float)

仅使用
numpy
,并使用生成器表达式:

In [105]: np.stack((np.ones(3) for _ in range(3)))                                      
/usr/local/lib/python3.6/dist-packages/IPython/core/interactiveshell.py:3254: 
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.:
Out[105]: 
array([[1., 1., 1.],
       [1., 1., 1.],
       [1., 1., 1.]])
使用列表理解创建数组:

In [106]: np.stack([np.ones(3) for _ in range(3)])                                      
Out[106]: 
array([[1., 1., 1.],
       [1., 1., 1.],
       [1., 1., 1.]])
我不使用
tf
,因此只能猜测:

tf.data.Dataset.enumerate(tf.data.Dataset.range(20, 40))
生产。但据我所知,tensorflow在“生成器式”的张量、潜在执行(管道?)和“渴望式”求值之间有区别,在求值过程中,实际求值的张量和张量表达式生成数组(或类似对象)<代码>np。堆栈尝试将其输入转换为数组

Tf.data.Dataset.enumerate的代码示例:

dataset = tf.data.Dataset.from_tensor_slices([1, 2, 3])
dataset = dataset.enumerate(start=5)
for element in dataset.as_numpy_iterator():
  print(element)
枚举
返回一个interator。您仍然需要对其进行迭代,就像在这个
for
循环中一样。或
列表(数据集)


您可以使用
tfds
执行此操作,您可以查看文档

示例如何使用:

array = tfds.as_numpy(ds)