Я хочу замаскировать многомерный массив, скажем, 4D-массив A формы N x N x N x N, где у меня есть другая маска (a, b и c) для последних трех измерений. Итак, a, b и c - это векторы со значениями True и False, имеющими длину N. Попытка замаскировать A как A[:,a,b,c] дает исключение (что это пытается сделать?), A[:,:,:,d][:,:,c][:,b] работает,
но создает ненужные промежуточные звенья. Если бы у меня были маски для каждого измерения, я бы использовал их как A[numpy.ix_(a, b, c, d)] для создания промежуточного массива индексации, но я не хочу создавать фиктивную маску a, которая везде является True. Спасибо.
Редактировать:
import numpy as np
A = np.arange(3**4).reshape((3,3,3,3))
a = np.asarray([True, True, True])
b = np.asarray([False, False, True])
c = np.asarray([True, True, False])
B = A[:,:,:,c][:,:,b][:,a]
print(B)
B2 = A[:,a,b,c]
print(B2)
выход:
[[[[ 6 7]]
[[15 16]]
[[24 25]]]
[[[33 34]]
[[42 43]]
[[51 52]]]
[[[60 61]]
[[69 70]]
[[78 79]]]]
Traceback (most recent call last):
File "test2.py", line 11, in <module>
B2 = A[:,a,b,c]
IndexError: shape mismatch: indexing arrays could not be broadcast
together with shapes (3,) (1,) (2,)
Ой! Вы правы, numpy.ix_ в этом случае работает! Я попытался сделать вопрос более общим, но слишком сильно изменил суть проблемы. В моем случае я действительно хочу замаскировать только 2-е, 3-е и 4-е измерения. Так что что-то вроде A[:,numpy.ix_(b,c,d)] вместо A[:,:,:,d][:,:,c][:,b]. Первое, однако, приводит к Traceback (most recent call last): File "test2.py", line 10, in <module> print(A[:,np.ix_(b,c,d)]) ValueError: could not broadcast input array from shape (2,1) into shape (1).
Пожалуйста, отредактируйте вопрос аналогичным образом.
Для этого конкретного случая: np.moveaxis(np.moveaxis(A,0,-1)[np.ix_(b,c,d)],-1,0). В общем случае вы можете захотеть работать с slice.
Я отредактировал вопрос и спасибо за вашу помощь. Не могли бы вы привести мне пример того, как я бы использовал slice в этом случае?






Вы можете добиться этого с помощью трюка транспонирования:
In [19]: (A.T[np.ix_(c.T, b.T, a.T)]).T
Out[19]:
array([[[[ 6, 7]],
[[15, 16]],
[[24, 25]]],
[[[33, 34]],
[[42, 43]],
[[51, 52]]],
[[[60, 61]],
[[69, 70]],
[[78, 79]]]])
Не работает
A[numpy.ix_(a, b, c, d)]?