Как получить доступ к массиву по списку координат точек - PullRequest
2 голосов
/ 16 апреля 2020

У меня есть массив A = np.ones((4,4,4)) и другой массив, представляющий координаты точки в массиве A , называемые B , допустим, что B = [[2,2,2], [3,2,1]].

Я пытался получить доступ к A с помощью индексации массива, как A [B], но это не сработало.

Как я могу сделать это элегантным способом, который также работает для B, так как он имеет более высокие размеры, как B формы (10, 20, 3)?

1 Ответ

0 голосов
/ 16 апреля 2020

Вы можете передать список координат, но вы должны транспонировать список. Таким образом, элементы i -го измерения передаются как i -й элемент в индексации, например, с помощью:

A[tuple(np.transpose(B))]

Для 4 × 4 × 4 матрица:

>>> A = np.arange(64).reshape(4,4,4)
>>> A
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11],
        [12, 13, 14, 15]],

       [[16, 17, 18, 19],
        [20, 21, 22, 23],
        [24, 25, 26, 27],
        [28, 29, 30, 31]],

       [[32, 33, 34, 35],
        [36, 37, 38, 39],
        [40, 41, 42, 43],
        [44, 45, 46, 47]],

       [[48, 49, 50, 51],
        [52, 53, 54, 55],
        [56, 57, 58, 59],
        [60, 61, 62, 63]]])

мы получаем для заданных координат:

>>> A[tuple(np.transpose(B))]
array([42, 57])

, и если мы рассчитаем их вручную, мы получим:

>>> A[2,2,2]
42
>>> A[3,2,1]
57

Фон :

A[1,2,3] - это сокращение от A[(1,2,3)] (так в кортеже). Вы можете выбрать несколько элементов с помощью A[([2,3], [2,2], [2,1])], но затем вам сначала нужно транспонировать данные.

Поскольку данные представлены как [[2,2,2], [3,2,1]], нам, таким образом, сначала нужно транспонировать в [[2,3], [2,2], [2,1]]. Затем мы оборачиваем его в кортеж и можем использовать его для индексации A.

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