FutureWarning:要堆栈的数组必须作为“序列”类型(例如列表或元组)传递。不推荐对非序列迭代的支持

Nic*_*ais 10 python numpy tensorflow

我正在尝试将 Tensorflow 数据集转换为 NumPy 数组,但收到弃用警告:

FutureWarning:要堆栈的数组必须作为“序列”类型(例如列表或元组)传递。从 NumPy 1.16 开始,对非序列迭代(例如生成器)的支持已被弃用,并且将来会引发错误。

这样做的“新”方式是什么?

可重现的示例与numpy 1.18.1tensorflow 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)
Run Code Online (Sandbox Code Playgroud)

我尝试过的:我一次只能对一个维度进行操作。

np.fromiter(ds.map(lambda x, y: x), float)
Run Code Online (Sandbox Code Playgroud)

hpa*_*ulj 3

仅使用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.]])
Run Code Online (Sandbox Code Playgroud)

使用列表理解来创建数组:

In [106]: np.stack([np.ones(3) for _ in range(3)])                                      
Out[106]: 
array([[1., 1., 1.],
       [1., 1., 1.],
       [1., 1., 1.]])
Run Code Online (Sandbox Code Playgroud)

我不使用tf,所以只能猜测:

tf.data.Dataset.enumerate(tf.data.Dataset.range(20, 40))
Run Code Online (Sandbox Code Playgroud)

产生。但据我了解,张量流在“类似生成器”、潜在执行(管道?)和“热切”求值之间有区别,其中张量和张量表达式实际上被求值,生成数组(或类似的对象) )。 np.stack尝试将其输入转换为数组。

代码示例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)
Run Code Online (Sandbox Code Playgroud)

enumerate返回一个迭代器。您仍然需要迭代它,就像在这个for循环中一样。或者list(dataset)

https://www.tensorflow.org/api_docs/python/tf/data/Dataset#enumerate