выбрать значения в массиве 3D на основе массива выбора 2D (со значениями индексов) - PullRequest
0 голосов
/ 13 июня 2018

У меня есть 2D выборка или массив масок с формой (375, 297), которая имеет в каждой ячейке значение, соответствующее целому числу индекса, в диапазоне от 0 до 23. Я хотел бы использовать этот 2D массив длявыберите в трехмерном массиве (с формой (24, 375, 297)) ячейки из первого измерения (с длиной 24), чтобы вывести двумерный массив с формой (375,297).Я пытался с модной индексацией и пакетом xarray без успеха.Как это сделать с помощью Python 3.6?

Небольшой пример:

Двухмерный массив или маска выбора (2,3), со значениями (индексы для трехмерного массива) в диапазоне от 0 до 3 -

[[0,1,2],
 [3,1,0]] 

3D-массив (4,2,3) для фильтрации с предыдущей маской 2D-выбора -

[[[25,27,30],
  [15,18,21]],
 [[13,19, 1],
  [5, 7, 10]],
 [[10, 1, 2],
  [5, 6, 18]],
 [[3, 13,18],
  [30,42,24]]]

Ожидаемый 2D (2,3) массив Вывод после применения маски 2D-выбора -

[[25,19, 2],
 [30, 7,21]]

1 Ответ

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

Редактировать: игнорировать над линией. Получить индекс массива, который вы хотите из вашего 2D-массива, а затем просто получить этот индекс один из 3D-массива.

index3d = arr2d[i][j]
new_arr = arr3d[index3d]    # gives the 2D array at the 3D array's index 'index3d'

Пример:

# shape of arr3d = 3,2,3
arr3d = [[[2,4,6],[8,10,12]],[[3,6,9],[12,15,18]],[[1,6,2],[5,3,4]]]
# shape of arr2d = 2,3, values 0-2
arr2d = [[0,1,0],[2,1,2]]
# select arr3d index from arr2d
index3d = arr2d[1][0]
# get 2D array from arr3d at index3d
new_arr = arr3d[index3d]
# prints:
# [[1, 6, 2], [5, 3, 4]]
print(new_arr)

Редактировать:

# shape of arr3d = 3,2,3
arr3d = [[[2,4,6],[8,10,12]],
         [[3,6,9],[12,15,18]],
         [[1,6,2],[5,3,4]]]
# shape of arr2d = 2,3, values 0-2
arr2d = [[0,1,0],
         [2,1,2]]
new_arr = [[],[]]
# append the values from the correct 2D array in arr3d
for row in range(len(arr2d)):
    for col in range(len(arr2d[row])):
        i = arr2d[row][col] # i selects the correct 2D array from arr3d
        new_arr[row].append(arr3d[i][row][col]) # get the same row/column from the new array
# prints:
# [[2, 6, 6], [5, 15, 4]]
print(new_arr)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...