Итерация по трехмерной фигуре с использованием одного измерения в качестве итератора оставшихся измерений в цикле - PullRequest
0 голосов
/ 05 декабря 2018

Несмотря на то, что существует ряд похожих вопросов, связанных с итерацией по трехмерному массиву, и после того, как я попробовал некоторые функции, такие как nditer numpy, я все еще не понимаю, как можно достичь следующего:

Iиметь сигнал измерений (30, 11, 300), что составляет 30 испытаний 11 сигналов, содержащих 300 сигнальных точек.

Пусть этот сигнал будет обозначаться переменной 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 сигналов, содержащих 300 точек на 1 графике,30 разЯ хочу построить график сигналов.Не первое (0-е) испытание сигналов каждый раз.Любые советы о том, как это сделать?

Ответы [ 3 ]

0 голосов
/ 05 декабря 2018

Вы жестко кодируете 0-й фрагмент вне цикла for.Вам нужно создать x_plot, чтобы быть внутри цикла.Фактически вы можете упростить свой код, вообще не используя x_plot.

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

0 голосов
/ 05 декабря 2018

В общем случае для всех nD-массивов, где n> 1, вы можете выполнять итерацию по самому первому измерению массива , как если бы вы выполняли итерацию по любому другому итерируемому.Для проверки того, является ли массив итеративным, вы можете использовать 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, чтобы переместить нужную ось напервая позиция, а затем итерация по ней, как упомянуто в итерация по произвольному измерению массива


ПРИМЕЧАНИЕ : сказав, чтоnumpy.rollaxis поддерживается только для обратной совместимости.Поэтому вместо перемещения желаемой оси в первое измерение рекомендуется использовать numpy.moveaxis.

0 голосов
/ 05 декабря 2018

Вы должны иметь возможность итерации по первому измерению с циклом for:

for s in x_:
    sliding_window_plot(s)

с каждой итерацией s будет следующим массивом формы (11, 300).

...