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

2024-10-05 10:36:37 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我有一个尺寸(30,11,300)的信号,它是11个信号的30次试验,包含300个信号点。在

让这个信号用变量x_表示

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

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

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

它在一个图上绘制相同的(第一次试验)11个信号,包含300个点,30次。 我要它画出第I组信号。不是第一次(第0次)尝试信号。有什么建议吗?在


Tags: 函数innumpy图形目标for信号plot
3条回答

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

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

一般来说,对于n>;1的所有nD数组,可以迭代数组的第一个维度,就像迭代任何其他iterable一样。要检查数组是否为iterable,可以使用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代替将所需的轴移动到第一个维度。在

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

for s in x_:
    sliding_window_plot(s)

每次迭代,s将是下一个shape数组(11300)。在

相关问题 更多 >

    热门问题