Маскирование многомерного массива NumPy - PullRequest
0 голосов
/ 09 октября 2018

Я хочу замаскировать многомерный массив, скажем, массив 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,)

1 Ответ

0 голосов
/ 10 октября 2018

Этого можно добиться, используя прием транспонирования:

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]]]])
...