Python: доступ к сохраненным точкам из двумерного массива в трехмерном массиве - PullRequest
0 голосов
/ 09 марта 2019

Я получил двумерный массив NumPy (shape(y,x)=601,1200) и трехмерный массив NumPy (shape(z,y,x)=137,601,1200).

В моем 2d-массиве я сохранил значения z в точке y, x, к которой теперь хочу получить доступ из своего 3d-массива, и сохранил его в новом 2d-массиве.

Я пытался что-то подобное безуспешно.

levels = array2d.reshape(-1)
y = np.arange(601)
x = np.arange(1200)
newArray2d=oldArray3d[levels,y,x]

IndexError: несоответствие формы: индексирование массивов не может быть передано вместе с фигурами (721200,) (601,) (1200,)

Я не хочу пробовать что-то с циклами, так есть ли более быстрый метод?

Ответы [ 2 ]

0 голосов
/ 09 марта 2019

Это ваши данные:

x_len = 12     # In your case, 1200
y_len = 6      # In your case, 601
z_len = 3      # In your case, 137

import numpy as np
my2d = np.random.randint(0,z_len,(y_len,x_len))
my3d = np.random.randint(0,5,(z_len,y_len,x_len))

Это один из способов создания вашего нового 2d массива:

yindices,xindices = np.indices(my2d.shape)
new2d = my3d[my2d[:], yindices, xindices]

Примечания:

  1. Мы используем расширенную индексацию целых чисел.
  2. Это означает, что мы индексируем трехмерный массив my3d с помощью трех целочисленных индексных массивов.
  3. Для получения дополнительной информации о том, как индексировать целочисленные массивыработает, пожалуйста, обратитесь к моему ответу на этот другой вопрос
  4. В вашей попытке не было необходимости изменять вашу 2d с помощью reshape(-1), так как форма массива целочисленных индексов, которую мыpass, после любой трансляции станет формой результирующего 2d массива.
  5. Кроме того, при вашей попытке второй и третий индексные массивы должны иметь противоположные ориентации.То есть они должны иметь форму (y_len,1) и (1, x_len).Обратите внимание на различные позиции 1.Это гарантирует, что эти два индексных массива будут транслироваться
0 голосов
/ 09 марта 2019

В вашем вопросе есть некоторая неопределенность, но я думаю, что вы хотите выполнить расширенную индексацию следующим образом:

In [2]: arr = np.arange(24).reshape(4,3,2)                                      
In [3]: levels = np.random.randint(0,4,(3,2))                                   
In [4]: levels                                                                  
Out[4]: 
array([[1, 2],
       [3, 1],
       [0, 2]])
In [5]: arr                                                                     
Out[5]: 
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]]])
In [6]: arr[levels, np.arange(3)[:,None], np.arange(2)]                         
Out[6]: 
array([[ 6, 13],
       [20,  9],
       [ 4, 17]])

levels is (3,2).Я создал 2 других индексных массива, чтобы они передавали с ним (3,1) и (2,).Результатом является (3,2) массив значений из arr, выбранных их объединенными индексами.

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