Nic*_*ais 10 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.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)
仅使用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
| 归档时间: |
|
| 查看次数: |
8626 次 |
| 最近记录: |