2015-11-03 3 views
1

У меня есть большой двумерный массив так:Re порядка питон NumPy массив

array([[ 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,27,28,29,30,31,32], 
     [33,34,35,36,37,38,39,40], 
     [41,42,43,44,45,46,47,48], 
     ....]) 

и мне нужно, чтобы преобразовать его в:

array([ 1, 9,17, 2,10,18, 3,11,19, 4,12,20, 5,13,21, 6,14,22, 7,15,23, 8,16,24], 
     [25,33,41,26,34,42,27,35,43,28,36,44,29,37,45,30,38,46,31,39,47,32,40,48], 
     ... 

Обратите внимание, что это должно быть только что он должен делать.
Исходный массив содержит только логические значения и имеет размер 512x8. В моем примере я заказываю только 3 строки с 8 элементами в одну строку, но мне действительно нужны 32 строки с 8 элементами.

Мне очень жаль, но после 30 минут написания это единственное описание, которое я получил от своей проблемы. Надеюсь, этого достаточно.

+1

Если я читаю этот вопрос в обратном направлении, имеет смысл – Henry

+0

@Henry: Ха-ха ^^ вы почти правы. Я думаю, что это БОЛЬШЕ смысла, чем в противном случае. – InvAdErZz

ответ

5

Я думаю, что вы можете достичь желаемого результата с помощью двух reshape операций и transpose:

x = np.array([[ 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,27,28,29,30,31,32], 
       [33,34,35,36,37,38,39,40], 
       [41,42,43,44,45,46,47,48]]) 

y = x.reshape(2, 3, 8).transpose(0, 2, 1).reshape(2, -1) 

print(repr(y)) 
# array([[ 1, 9, 17, 2, 10, 18, 3, 11, 19, 4, 12, 20, 5, 13, 21, 6, 14, 
#   22, 7, 15, 23, 8, 16, 24], 
#  [25, 33, 41, 26, 34, 42, 27, 35, 43, 28, 36, 44, 29, 37, 45, 30, 38, 
#   46, 31, 39, 47, 32, 40, 48]]) 

Сломать, что немного вниз:

  1. @ первой reshape операции hpaulj дает нам следующее:

    x1 = x.reshape(2, 3, 8) 
    print(repr(x1)) 
    # array([[[ 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, 27, 28, 29, 30, 31, 32], 
    #   [33, 34, 35, 36, 37, 38, 39, 40], 
    #   [41, 42, 43, 44, 45, 46, 47, 48]]]) 
    print(x1.shape) 
    # (2, 3, 8) 
    
  2. Чтобы получить желаемый результат, нам нужно «свернуть» этот массив по второму размеру (с размером 3), а затем по третьему размеру (с размером 8). Самый простой способ достижения такого рода вещи является первым transpose массива, так что размеры вы хотите, чтобы свернуть вдоль упорядочиваются от первого до последнего:

    x2 = x1.transpose(0, 2, 1) # you could also use `x2 = np.rollaxis(x1, 1, 3)` 
    print(repr(x2)) 
    # array([[[ 1, 9, 17], 
    #  [ 2, 10, 18], 
    #  [ 3, 11, 19], 
    #  [ 4, 12, 20], 
    #  [ 5, 13, 21], 
    #  [ 6, 14, 22], 
    #  [ 7, 15, 23], 
    #  [ 8, 16, 24]], 
    
    # [[25, 33, 41], 
    #  [26, 34, 42], 
    #  [27, 35, 43], 
    #  [28, 36, 44], 
    #  [29, 37, 45], 
    #  [30, 38, 46], 
    #  [31, 39, 47], 
    #  [32, 40, 48]]]) 
    print(x2.shape) 
    # (2, 8, 3) 
    
  3. Наконец я могу использовать reshape(2, -1), чтобы свернуть массив за последние два измерения. -1 вызывает numpy для определения соответствующего размера в последнем измерении в зависимости от количества элементов в x.

    y = x2.reshape(2, -2) 
    
+0

Спасибо. Выглядит законно;) Я попробую завтра;) – InvAdErZz

+0

именно то, что мне нужно! Танк тебя снова :) – InvAdErZz

1

Похоже, отправная точка, чтобы изменить его, например

In [49]: x.reshape(2,3,8) 
Out[49]: 
array([[[ 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, 27, 28, 29, 30, 31, 32], 
     [33, 34, 35, 36, 37, 38, 39, 40], 
     [41, 42, 43, 44, 45, 46, 47, 48]]]) 

.ravel(order='F') не получает это право, так что я думаю, что нам нужно поменять некоторые оси до выравнивания. Это должна быть копия.

Используя транспонирование @ ali_m в:

In [65]: x1=x.reshape(2,3,8) 

In [66]: x1.transpose(0,2,1).flatten() 
Out[66]: 
array([ 1, 9, 17, 2, 10, 18, 3, 11, 19, 4, 12, 20, 5, 13, 21, 6, 14, 
     22, 7, 15, 23, 8, 16, 24, 25, 33, 41, 26, 34, 42, 27, 35, 43, 28, 
     36, 44, 29, 37, 45, 30, 38, 46, 31, 39, 47, 32, 40, 48]) 

упс - есть внутренний слой вложенности, который легко пропустить

array([1,9,17,2,10,18,3,11,19,4,12,20,5,13,21,6,14,22,7,15,23,8,16,24], 
     [25,33,41,26,34,42,27,35,43,28,36,44,29,37,45,30,38,46,31,39,47,32,40,4], 

Вы пропускаете [] набор. Итак, @ali_m понял это правильно.

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

+0

Да, я попробовал его с помощью resahpe и swap оси, но это привело к замене всей матрицы, но мне нужна свопа по 32 строки за один раз. – InvAdErZz

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