Как эффективно отсортировать два больших массива numpy в массив массивов? - PullRequest
0 голосов
/ 07 марта 2020

Предположим, у меня есть два двумерных массива numpy, каждый из которых на самом деле очень большой (порядка 1 миллиона элементов):

a = np.array([1,2,3],[4,5,6],[7,8,9])
b = np.array([11,22,33],[44,55,66],[77,88,99])

Я хотел бы создать новый массив, элементы которого 1d, два массивы элементов из компонента i, j компонента a и компонента i, j элемента b:

c = [[1,11], [2,22], [3,33], [4,44], [5,55], [6,66], [7,77], [8,88], [9,99]]

Я пытаюсь сделать что-то вроде этого:

c = np.array([])
for i in range(0,3):
     for j in range(0,3):
          number_pair = numpy.array([a[i,j], b[i,j]])
          c = numpy.append(c, number_pair)

Однако это ' выравнивает массив, создавая:

c = [1,11,2,22,3,33,4,44,5,55,6,66,7,77,8,88,9,99]

Может ли vstack справиться с этим? Есть ли намного более простой способ подумать об этом и все же получить желаемый результат?

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

1 Ответ

0 голосов
/ 07 марта 2020

Давайте начнем с чего-то более простого - zip для простых массивов:

In [113]: a = [1,2,3,4,5,6,7,8,9] 
     ...: b = [11,22,33,44,55,66,77,88,99]                                                     
In [114]: list(zip(a,b))                                                                       
Out[114]: 
[(1, 11),
 (2, 22),
 (3, 33),
 (4, 44),
 (5, 55),
 (6, 66),
 (7, 77),
 (8, 88),
 (9, 99)]

Это то, что вы хотите - за исключением того, что это список кортежей, а не списков.

Ваш a и b, кажется, имеет своего рода вложенность, списки со списком. ТАК, что они должны быть сплющены, чтобы использовать этот тип zip. Существуют способы сглаживания списков, но проще использовать массивы.

Но сначала - попробуйте выражение a:

In [116]: a = np.array([1,2,3],[4,5,6],[7,8,9])                                                
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-116-41a87620921a> in <module>
----> 1 a = np.array([1,2,3],[4,5,6],[7,8,9])

ValueError: only 2 non-keyword arguments accepted

У вас отсутствуют скобки:

In [117]: a = np.array([[1,2,3],[4,5,6],[7,8,9]])                                              
In [118]: a                                                                                    
Out[118]: 
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])
In [119]: a.shape                                                                              
Out[119]: (3, 3)
In [120]: b = np.array([[11,22,33],[44,55,66],[77,88,99]])                                     
In [121]: b.shape                                                                              
Out[121]: (3, 3)

Свести массив очень просто:

In [122]: a.ravel()                                                                            
Out[122]: array([1, 2, 3, 4, 5, 6, 7, 8, 9])

In [123]: list(zip(a.ravel(), b.ravel()))                                                      
Out[123]: 
[(1, 11),
 (2, 22),
 (3, 33),
 (4, 44),
 (5, 55),
 (6, 66),
 (7, 77),
 (8, 88),
 (9, 99)]

Мы также можем объединить эти два сглаженных массива в один:

In [125]: np.array([a.ravel(),b.ravel()])                                                      
Out[125]: 
array([[ 1,  2,  3,  4,  5,  6,  7,  8,  9],
       [11, 22, 33, 44, 55, 66, 77, 88, 99]])

и затем использовать numpy transpose:

In [126]: np.array([a.ravel(),b.ravel()]).T                                                    
Out[126]: 
array([[ 1, 11],
       [ 2, 22],
       [ 3, 33],
       [ 4, 44],
       [ 5, 55],
       [ 6, 66],
       [ 7, 77],
       [ 8, 88],
       [ 9, 99]])

Существует ряд других способов объединения этих массивов.

In [127]: np.array((a,b))                                                                      
Out[127]: 
array([[[ 1,  2,  3],
        [ 4,  5,  6],
        [ 7,  8,  9]],

       [[11, 22, 33],
        [44, 55, 66],
        [77, 88, 99]]])
In [128]: _.transpose(1,2,0).reshape(-1,2)                                                     
Out[128]: 
array([[ 1, 11],
       [ 2, 22],
       [ 3, 33],
       [ 4, 44],
       [ 5, 55],
       [ 6, 66],
       [ 7, 77],
       [ 8, 88],
       [ 9, 99]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...