使用一维作为循环中的迭代器剩余维度迭代 3D numpy

Iterating over 3D numpy using one dimension as iterator remaining dimensions in the loop

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

我有一个维度为 (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[:,:])

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

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

for s in x_:
    sliding_window_plot(s)

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

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

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

一般来说,对于 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[ 中提到的那样对其进行迭代=18=]


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