2016-05-27 4 views
0

У меня есть массив 3D numpy, и я хочу разбить его на первые 2 измерения (и выделить все элементы в последнем). Есть ли простой способ сделать это с помощью numpy?Расщепление ND-массивов с использованием numpy

Пример: данный массив

a = 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]]]) 

Я хотел бы разделить его N способы, с помощью первых двух осей (сохраняя при этом всех элементах последней), например ,:

a[0:2, 0:2, :], a[2:3, 2:3, :] 

Но его не нужно разделять поровну. Похоже, numpy.array_split будет разделить на все оси?

+0

Пожалуйста, убедитесь, что ваш вопрос завершен, как описано здесь более подробно: http://stackoverflow.com/help/mcve. Вы получите более быстрые ответы на полные вопросы. – tfv

+0

Любые примеры? Я не понимаю значение '(и выбираю все элементы в последнем)' – VICTOR

+0

Проблема с 'split' и' array_split' заключается в том, что они работают только на 1 оси, а результаты представляют собой список подмассивов. – hpaulj

ответ

0
In [179]: np.array_split(a,2,0) 
Out[179]: 
[array([[[ 0, 1, 2], 
     [ 3, 4, 5], 
     [ 6, 7, 8]], 

     [[ 9, 10, 11], 
     [12, 13, 14], 
     [15, 16, 17]]]), 
array([[[18, 19, 20], 
     [21, 22, 23], 
     [24, 25, 26]]])] 

такая же, как [a[:2,:,:], a[2:,:,:]]

Вы могли бы петля на этих 2-х массивов и применять разделение на следующей оси.

In [182]: a2=[np.array_split(aa,2,1) for aa in a1] 

In [183]: a2 # edited for clarity 
Out[183]: 
[[array([[[ 0, 1, 2], 
      [ 3, 4, 5]], 
     [[ 9, 10, 11], 
      [12, 13, 14]]]), # (2,2,3) 
    array([[[ 6, 7, 8]], 
     [[15, 16, 17]]])], # (2,1,3) 

[array([[[18, 19, 20], 
      [21, 22, 23]]]), # (1,2,3) 
    array([[[24, 25, 26]]])]] # (1,1,3) 

In [184]: a2[0][0].shape 
Out[184]: (2, 2, 3) 

In [185]: a2[0][1].shape 
Out[185]: (2, 1, 3) 

In [187]: a2[1][0].shape 
Out[187]: (1, 2, 3) 

In [188]: a2[1][1].shape 
Out[188]: (1, 1, 3) 

С потенциалом расщепления в неровных массивах в каждом измерении, это трудно сделать это в полной векторизованной форме. И даже если расщепления были даже сложными, чтобы сделать такое разбиение сетки, потому что значения не смежны. В этом примере есть пробел между 5 и 9 в первом подмассиве.

0

Быстрый список понимание будет делать трюк

[np.array_split(arr, 2, axis=1) 
for arr in np.array_split(a, 2, axis=0)] 

Это приведет к списку списков, элементы которого содержат массивы, которые вы ищете.

Смежные вопросы