【问题标题】:Iterating over 3D numpy using one dimension as iterator remaining dimensions in the loop使用一维作为迭代器迭代 3D numpy 循环中的剩余维度
【发布时间】:2019-05-06 13:22:45
【问题描述】:

尽管存在许多与迭代 3D 数组相关的类似问题,并且在尝试了诸如 numpy 的 nditer 之类的一些函数之后,我仍然对如何实现以下目标感到困惑:

我有一个维度为 (30, 11, 300) 的信号,它包含 300 个信号点的 11 个信号的 30 次试验。

让这个信号用变量x_来表示

我有另一个函数,它将 (11, 300) 矩阵作为输入并将其绘制在 1 个图形上(11 个信号包含 300 个信号点绘制在单个图形上)。设此函数为sliding_window_plot

目前,我可以让它这样做:

x_plot = x_[0,:,:]
for i in range(x_.shape[0]):
    sliding_window_plot(x_plot[:,:])

在 1 个图上绘制相同的(第一次试验)11 个包含 300 个点的信号,共 30 次。 我希望它绘制第 i 组信号。不是每次信号的第一次(第 0 次)试验。有关如何尝试此操作的任何提示?

【问题讨论】:

    标签: python numpy multidimensional-array iterator numpy-ndarray


    【解决方案1】:

    您应该能够使用for 循环遍历第一个维度:

    for s in x_:
        sliding_window_plot(s)
    

    每次迭代 s 将是下一个形状数组 (11, 300)。

    【讨论】:

    • TIL numpy 数组是可迭代的。谢谢!
    【解决方案2】:

    您正在对 for 循环之外的第 0 个切片进行硬编码。您需要创建 x_plot 才能进入循环。事实上,您可以完全不使用x_plot 来简化您的代码。

    for i in rangge(x_.shape[0]): sliding_window_plot(x_[i])

    【讨论】:

      【解决方案3】:

      一般而言,对于 n>1 的所有 nD 数组,您可以迭代 数组的第一个维度,就像您正在迭代任何其他可迭代对象一样。要检查数组是否是可迭代的,可以使用np.iterable(arr)。这是一个例子:

      In [9]: arr = np.arange(3 * 4 * 5).reshape(3, 4, 5) 
      
      In [10]: arr.shape 
      Out[10]: (3, 4, 5) 
      
      In [11]: np.iterable(arr) 
      Out[11]: True 
      
      In [12]: for a in arr: 
          ...:     print(a.shape) 
          ...:                     
      (4, 5)
      (4, 5)
      (4, 5)
      

      因此,在每次迭代中,我们都会得到一个矩阵(形状为(4, 5))作为输出。总共 3 个这样的输出构成了形状为 (3, 4, 5) 的 3D 数组


      如果出于某种原因,您想要迭代其他维度,那么您可以使用 numpy.rollaxis 将所需的轴移动到第一个位置,然后按照 iterating-over-arbitrary-dimension-of-numpy-array 中的说明对其进行迭代


      注意:话虽如此,numpy.rollaxis 只是为了向后兼容而维护。因此,建议使用numpy.moveaxis 代替将所需的轴移动到第一个维度。

      【讨论】:

      • rollaxis 只是为了向后兼容而维护,而是鼓励使用moveaxis
      猜你喜欢
      • 2019-04-23
      • 1970-01-01
      • 1970-01-01
      • 2019-04-26
      • 2021-08-23
      • 1970-01-01
      • 1970-01-01
      • 2016-01-28
      • 1970-01-01
      相关资源
      最近更新 更多