使用一维作为循环中的迭代器剩余维度迭代 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
而不是将所需的轴移动到第一个维度。
尽管有许多与遍历 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)
如果出于某种原因,您想迭代其他维度,那么您可以使用 numpy.rollaxis
将所需的轴移动到第一个位置,然后按照 iterating-over-arbitrary-dimension-of-numpy-array[ 中提到的那样对其进行迭代=18=]
注意:话虽如此,numpy.rollaxis
只是为了向后兼容而保留。因此,建议使用 numpy.moveaxis
而不是将所需的轴移动到第一个维度。