Произвольные 1D срезы (элементы вдоль оси) через ndarray - NumPy - PullRequest
1 голос
/ 15 июня 2019

Я нашел несколько вопросов, которые близки к тому, что я задаю, но они настолько различны, что, кажется, не решают мою проблему. Я пытаюсь взять 1d срез вдоль одной оси для ndarray. В качестве примера для трехмерного массива

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

Я хочу следующие 1d ломтики

[0,1,2]
...
[24,25,26]

[0,3,6]
...
[20,23,26]

[0,9,18]
...
[8,17,26]

, что эффективно приравнивается к следующему (для трехмерных массивов):

ary[i,j,:]
ary[i,:,k]
ary[:,j,k]

Я хочу обобщить это в массив из n измерений

(для двумерного массива мы бы получили ary [i ,:] и ary [:, j] и т. Д.)

Есть ли функция numpy, которая позволяет мне делать это?

РЕДАКТИРОВАТЬ: Исправлена ​​индексация 2-го измерения

1 Ответ

1 голос
/ 15 июня 2019

Мы могли бы переставлять оси, выбирая каждую из осей по одной, толкая ее в конце и изменяя форму. Мы бы использовали ndarray.ndim для обобщения на общие n-dim ndarrays. Также, np.transpose было бы полезно здесь для перестановки осей и np.roll, чтобы получить порядок свернутых осей. Реализация будет довольно простой и приведена ниже -

# a is input ndarray
R = np.arange(a.ndim)
out = [np.transpose(a,np.roll(R,i)).reshape(-1,a.shape[i]) for i in R]

Пробный прогон -

In [403]: a = np.arange(27).reshape(3,3,3)

In [325]: R = np.arange(a.ndim)

In [326]: out = [np.transpose(a,np.roll(R,i)).reshape(-1,a.shape[i]) for i in R]

In [327]: out[0]
Out[327]: 
array([[ 0,  1,  2],
       [ 3,  4,  5],
       ...
       [24, 25, 26]])

In [328]: out[1]
Out[328]: 
array([[ 0,  3,  6],
       [ 9, 12, 15],
       ....
       [20, 23, 26]])

In [329]: out[2]
Out[329]: 
array([[ 0,  9, 18],
       [ 1, 10, 19],
       ....
       [ 8, 17, 26]])
...