Python NumPy - угловой фрагмент трехмерного массива - PullRequest
0 голосов
/ 18 февраля 2019

Работая в NumPy, я понимаю, как нарезать 2D-массивы из 3D-массива, используя в этой статье .

В зависимости от оси, которую я хочу нарезать:

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

Нарезка даст мне:

i_slice = array[0]

    [[0  1  2]
     [3  4  5]
     [6  7  8]]

j_slice = array[:, 0]

    [[0  1  2]
     [9  10 11]
     [18 19 20]]

k_slice = array[:, :, 0]

    [[0  3  6]
     [9  12 15]
     [18 21 24]]

Но можно ли нарезатьпод углом 45 градусов? , например:

j_slice_down = array[slice going down starting from index 0]

    [[0  1  2]
     [12 13 14]
     [24 25 26]]

Я смог добиться этого во всех 3-х осях, идущих вверх или вниз, и даже оборачивая все вокруг ... в темном спискедней с большим количеством циклов for ... но я уверен, что в NumPy должен быть лучший путь.

Обновление, выбранный ответ:

Я выбрал ответ hpaulj, создав два координатных массива с np.arrange.Немного поработав, я смог сделать так, чтобы он соответствовал моим потребностям - возвращать срез под любым углом, по любой оси, асимметричным измерением трехмерного массива и в любой позиции, включая обтекание по всей длине, чтобы оно было одинаковым.как ось.

My method using np.arrange

Два np.arrange массива были сделаны для x и y.

Различные методы, такие как np.roll, инкремент, np.hstack и np.concatenate, были выполнены для массива np.arrange массива оси x.y = y[::-1] для альтернативного угла.

if axis is 'z': #i
    slice_notation = np.index_exp[x, y, :] 

elif axis is 'y': #k
    slice_notation = np.index_exp[x, :, y]

else: #j 
    slice_notation = np.index_exp[:, x, y]

Создает выражение среза, затем я использую slice_notation для выполнения необходимых операций на месте.

Другие предложенные методы: np.diagonal и np.eye могут быть более подходящими для других, хотя они могут иметь другие требования, чем я.

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019
In [145]: arr[np.arange(3), np.arange(3),:]
Out[145]: 
array([[ 0,  1,  2],
       [12, 13, 14],
       [24, 25, 26]])
0 голосов
/ 18 февраля 2019

Вы можете попробовать с np.diagonal:

arr = np.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]]])

np.diagonal(arr).T
array([[ 0,  1,  2],
       [12, 13, 14],
       [24, 25, 26]])
...