Нарезка трехмерного массива с использованием двухмерного массива в Numpy - PullRequest
1 голос
/ 28 мая 2020

У меня возник вопрос по нарезке трехмерного массива с использованием двухмерного массива. largearray - это трехмерный массив, который я хочу нарезать значениями из 2d smallarray

    array([[[36.914   , 38.795   , 37.733   , 36.68    , 35.411003,
     33.494   , 36.968002, 39.902   , 43.943   , 48.398   ],
    [37.121   , 38.723   , 37.706   , 36.653   , 35.491997,
     33.638   , 36.697998, 39.668   , 43.817   , 48.551   ]],

   [[37.292   , 28.454   , 23.414   , 23.018   , 21.83    ,
     19.472   , 28.364   , 35.492   , 28.786999, 36.23    ],
    [37.04    , 28.256   , 23.135   , 22.937   , 21.839   ,
     19.382   , 28.517   , 35.816   , 28.922   , 36.509   ]]],

largearray.shape = (2, 2, 10)

smallarray = array ([[5, 7], [9, 3]]) smallarray.shape = (2, 2)

Результат должен быть вырезан из трехмерного массива до значения из соответствующего двухмерного массива. Результат должен выглядеть следующим образом:

    array([[[36.914   , 38.795   , 37.733   , 36.68    , 35.411003],
   [37.121   , 38.723   , 37.706   , 36.653   , 35.491997, 33.638   ,
   36.697998]],
   [[37.292   , 28.454   , 23.414   , 23.018   , 21.83    , 19.472   ,
   28.364   , 35.492   , 28.786999],
   [37.04 , 28.256, 23.135]]])

Возможные вычисления будут производиться на очень больших массивах, поэтому было бы здорово, если бы вычисления были настолько дешевыми, насколько это возможно.

Надеюсь, вы сможете помогите мне с этим!

1 Ответ

0 голосов
/ 28 мая 2020

Расчет будет немного проще, если 3D-массив и 2D-массивы преобразованы в 2D-массив и 1D-массив соответственно.

largearray = largearray.reshape(-1,largearray.shape[-1])
smallarray = smallarray.reshape(-1)

ans = np.array([largearray[i,:smallarray[i]].tolist() for i in range(len(smallarray))]).reshape(2,2)
...