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

时间:2018-12-05 02:46:31

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

尽管存在许多与遍历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[:,:])

绘制THE SAME(首次试用),在1个图中绘制包含300个点的11个信号,共30次。 我希望它绘制第i组信号。并非每次都进行第一次(第0次)信号测试。有关如何尝试此操作的任何提示?

3 个答案:

答案 0 :(得分:2)

通常对于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代替,将所需的轴移至第一维。

答案 1 :(得分:1)

您应该可以使用for循环遍历第一维:

for s in x_:
    sliding_window_plot(s)

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

答案 2 :(得分:1)

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

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