Как я могу получить подмассив в зависимости от условия? - PullRequest
0 голосов
/ 12 июня 2018

Например, у меня есть сложный массив формы (3,3,3), и я хочу найти угол элемента, когда величина массива вдоль оси 2 максимальна.То есть

a = np.random.random((3, 3, 3)) + 1j * np.random.random((3, 3, 3))

amp3d = np.abs(a)
amp2d = np.max(amp3d, axis=2)

angle2d =  np.zeros_like(amp2d)

for i in range(a.shape[0]):
    for j in range(a.shape[1]):
        for k in range(a.shape[2]):
            if amp3d[i, j, k] == amp2d[i,j]:
                angle2d[i, j] = np.angle(a[i, j, k])

Конечно, я могу сделать цикл, но я думаю, что существует довольно питонический способ выполнить эту задачу

В Matlab это будет выглядеть как np.angle(a[np.argmax(a, axis=2)])

Спасибо!

1 Ответ

0 голосов
/ 12 июня 2018

Создайте маску / логический массив для соответствующих значений, увеличив размер amp2d до соответствия amp3d, умножьте его на a и выберите максимальное значение для axis=2.

a = np.random.random((3, 3, 3)) + 1j * np.random.random((3, 3, 3))

amp3d = np.abs(a)
amp2d = np.max(amp3d, axis=2)

mask = amp3d == amp2d[...,np.newaxis]
angle2d = np.angle((a*mask).max(axis=2))

Проверьте документацию по индексированию для справки о том, что делает np.newaxis, или проверьте этот вопрос переполнения стека .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...