【问题标题】:The ways to avoid a numpy.stack FutureWarning?避免 numpy.stack FutureWarning 的方法?
【发布时间】:2021-12-01 04:02:37
【问题描述】:

我正在尝试堆叠存储在字典中的 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)

.

代码示例 No.2(更简洁,仍然没有给出警告):

data_stack = np.stack([data_matrix[key] for key in data_matrix.keys()], axis=1)

.

代码示例 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 一起工作而不发出警告?

【问题讨论】:

  • 你可能会做list(data_matrix.values()),但当然任何类型的操作都会增加计算时间。
  • @mapf,在此处添加 list 不会浪费时间。 stack 遍历输入参数的所有元素,添加一个维度。
  • @hpaulj 很高兴知道,谢谢!
  • dict.values() 扩展为完整列表是正常的。

标签: python numpy stack


【解决方案1】:

感谢大家的帮助。 @mapf 在其中一个 cmets 中找到了合适的答案。因此,我将在此处发布它作为最终解决方案:

data_stack = np.stack(list(data_matrix.values()), axis=1)

【讨论】:

    【解决方案2】:

    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.]])
    

    【讨论】:

      【解决方案3】:

      这里

      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)
      

      【讨论】:

      • 一条评论建议list(dict.values()) 基本上是一回事。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-23
      相关资源
      最近更新 更多