避免 numpy.stack FutureWarning 的方法?
The ways to avoid a numpy.stack FutureWarning?
我正在尝试堆叠存储在字典中的 numpy 数组。到目前为止,我找到了几种方法来做到这一点。不幸的是,最优雅的代码会打印 FutureWarning:
sys:1: 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.
.
代码示例No.1(不给出警告,但太繁琐):
data_stack = np.stack([data_matrix[0], data_matrix[1], data_matrix[2], data_matrix[3], data_matrix[4], data_matrix[5], data_matrix[6], data_matrix[7], data_matrix[8], data_matrix[9], data_matrix[10], data_matrix[11]], axis=1)
.
CODE EXAMPLE No.2(更简洁但仍然不给出警告):
data_stack = np.stack([data_matrix[key] for key in data_matrix.keys()], axis=1)
.
CODE EXAMPLE No.3(这个我最喜欢,但是有警告):
data_stack = np.stack(data_matrix.values(), axis=1)
我已尝试按如下方式解决此问题:
data_stack = np.stack([data_matrix.values()], axis=1)
但这似乎完全破坏了密码:
Traceback (most recent call last):
File "./CLN40ULPEF_PttV1350W1350G0000S0000T025.lib.py", line 261, in <module>
data_stack = np.stack([data_matrix.values()], axis=1)
File "<__array_function__ internals>", line 5, in stack
File "/usr/lib64/python3.9/site-packages/numpy/core/shape_base.py", line 430, in stack
axis = normalize_axis_index(axis, result_ndim)
numpy.AxisError: axis 1 is out of bounds for array of dimension 1
.
有没有一种(简单的)方法可以让 data_matrix.values()
与 numpy.stack
一起工作而不发出警告?
这里
data_stack = np.stack([data_matrix[key] for key in data_matrix.keys()], axis=1)
您正在迭代 data_matrix
dict
的键和每个给定键的检索值。您可以简单地迭代值,即:
data_stack = np.stack([v for v in data_matrix.values()], axis=1)
np.stack
在使用生成器警告功能 (arrays = _arrays_for_stack_dispatcher(arrays, stacklevel=6)
) 后做的第一件事是:
arrays = [asanyarray(arr) for arr in arrays]
然后它会检查匹配的形状
shapes = {arr.shape for arr in arrays}
并扩展数组维度
expanded_arrays = [arr[sl] for arr in arrays]
这是很多列表理解。
试图通过传递 dict_values
生成器而不是列表来节省打字或时间,是在浪费您的时间和精力。
In [159]: adict.values()
Out[159]:
dict_values([array([[1., 1.],
[1., 1.],
[1., 1.]]), array([[0., 0.],
[0., 0.],
[0., 0.]])])
In [160]: list(adict.values())
Out[160]:
[array([[1., 1.],
[1., 1.],
[1., 1.]]),
array([[0., 0.],
[0., 0.],
[0., 0.]])]
将列表应用于 values()
是正常的 Python3 做法。例如你不能索引生成器:
In [162]: adict.values()[0]
Traceback (most recent call last):
File "<ipython-input-162-23f4ccd9e2f7>", line 1, in <module>
adict.values()[0]
TypeError: 'dict_values' object is not subscriptable
In [163]: list(adict.values())[0]
Out[163]:
array([[1., 1.],
[1., 1.],
[1., 1.]])
谢谢大家的帮助。在 @mapf 的评论之一中找到了合适的答案。因此,我将post这里作为最终解决方案:
data_stack = np.stack(list(data_matrix.values()), axis=1)
我正在尝试堆叠存储在字典中的 numpy 数组。到目前为止,我找到了几种方法来做到这一点。不幸的是,最优雅的代码会打印 FutureWarning:
sys:1: 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.
.
代码示例No.1(不给出警告,但太繁琐):
data_stack = np.stack([data_matrix[0], data_matrix[1], data_matrix[2], data_matrix[3], data_matrix[4], data_matrix[5], data_matrix[6], data_matrix[7], data_matrix[8], data_matrix[9], data_matrix[10], data_matrix[11]], axis=1)
.
CODE EXAMPLE No.2(更简洁但仍然不给出警告):
data_stack = np.stack([data_matrix[key] for key in data_matrix.keys()], axis=1)
.
CODE EXAMPLE No.3(这个我最喜欢,但是有警告):
data_stack = np.stack(data_matrix.values(), axis=1)
我已尝试按如下方式解决此问题:
data_stack = np.stack([data_matrix.values()], axis=1)
但这似乎完全破坏了密码:
Traceback (most recent call last):
File "./CLN40ULPEF_PttV1350W1350G0000S0000T025.lib.py", line 261, in <module>
data_stack = np.stack([data_matrix.values()], axis=1)
File "<__array_function__ internals>", line 5, in stack
File "/usr/lib64/python3.9/site-packages/numpy/core/shape_base.py", line 430, in stack
axis = normalize_axis_index(axis, result_ndim)
numpy.AxisError: axis 1 is out of bounds for array of dimension 1
.
有没有一种(简单的)方法可以让 data_matrix.values()
与 numpy.stack
一起工作而不发出警告?
这里
data_stack = np.stack([data_matrix[key] for key in data_matrix.keys()], axis=1)
您正在迭代 data_matrix
dict
的键和每个给定键的检索值。您可以简单地迭代值,即:
data_stack = np.stack([v for v in data_matrix.values()], axis=1)
np.stack
在使用生成器警告功能 (arrays = _arrays_for_stack_dispatcher(arrays, stacklevel=6)
) 后做的第一件事是:
arrays = [asanyarray(arr) for arr in arrays]
然后它会检查匹配的形状
shapes = {arr.shape for arr in arrays}
并扩展数组维度
expanded_arrays = [arr[sl] for arr in arrays]
这是很多列表理解。
试图通过传递 dict_values
生成器而不是列表来节省打字或时间,是在浪费您的时间和精力。
In [159]: adict.values()
Out[159]:
dict_values([array([[1., 1.],
[1., 1.],
[1., 1.]]), array([[0., 0.],
[0., 0.],
[0., 0.]])])
In [160]: list(adict.values())
Out[160]:
[array([[1., 1.],
[1., 1.],
[1., 1.]]),
array([[0., 0.],
[0., 0.],
[0., 0.]])]
将列表应用于 values()
是正常的 Python3 做法。例如你不能索引生成器:
In [162]: adict.values()[0]
Traceback (most recent call last):
File "<ipython-input-162-23f4ccd9e2f7>", line 1, in <module>
adict.values()[0]
TypeError: 'dict_values' object is not subscriptable
In [163]: list(adict.values())[0]
Out[163]:
array([[1., 1.],
[1., 1.],
[1., 1.]])
谢谢大家的帮助。在 @mapf 的评论之一中找到了合适的答案。因此,我将post这里作为最终解决方案:
data_stack = np.stack(list(data_matrix.values()), axis=1)