Как преобразовать 2d np.array списков с плавающей точкой в ​​2d np.array с плавающей точкой, сгруппировав значения списка в строки - PullRequest
1 голос
/ 25 октября 2019

У меня есть огромный массив двумерных списков (dtype object), который я хочу преобразовать в массив двумерных чисел dtype float, поместив измерение, представленное списками, на 0-ую ось (строки). Списки в каждой строке всегда имеют одинаковую длину и содержат как минимум один элемент.

Вот минимальное воспроизведение ситуации:

import numpy as np
current_array = np.array(
    [[[0.0], [1.0]], 
    [[2.0, 3.0], [4.0, 5.0]]]
)
desired_array = np.array(
    [[0.0, 1.0], 
    [2.0, 4.0],
    [3.0, 5.0]]
)

Функции stack и dstack работают, только если первый уровень является кортежем. reshape потребует, чтобы третий уровень был частью массива. Интересно, есть ли относительно эффективный способ сделать это?

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

Ответы [ 2 ]

1 голос
/ 25 октября 2019
In [321]: current_array = np.array( 
     ...:     [[[0.0], [1.0]],  
     ...:     [[2.0, 3.0], [4.0, 5.0]]] 
     ...: )                                                                     
In [322]: current_array                                                         
Out[322]: 
array([[list([0.0]), list([1.0])],
       [list([2.0, 3.0]), list([4.0, 5.0])]], dtype=object)
In [323]: _.shape                                                               
Out[323]: (2, 2)

Переработать два ряда:

In [328]: current_array[1,:]                                                    
Out[328]: array([list([2.0, 3.0]), list([4.0, 5.0])], dtype=object)
In [329]: np.stack(current_array[1,:],1)                                        
Out[329]: 
array([[2., 4.],
       [3., 5.]])

In [330]: np.stack(current_array[0,:],1)                                        
Out[330]: array([[0., 1.]])

объединить их:

In [331]: np.vstack((_330, _329))                                               
Out[331]: 
array([[0., 1.],
       [2., 4.],
       [3., 5.]])

в одну строку:

In [333]: np.vstack([np.stack(row, 1) for row in current_array])                
Out[333]: 
array([[0., 1.],
       [2., 4.],
       [3., 5.]])
0 голосов
/ 25 октября 2019

Автор вопроса здесь.

Я нашел немного более элегантный (и более быстрый) способ, чем заполнение массива один за другим, а именно:

desired = np.array([np.concatenate([np.array(d) for d in lis]) for lis in current.T]).T
print(desired)
'''
[[0. 1.]
 [2. 4.]
 [3. 5.]]
 '''

Но он все равно делаетдовольно количество операций. Он транспонирует таблицу, чтобы иметь возможность суммировать соседние «измерения» (одним из них являются списки) с np.concatenate, а затем преобразовывает результат в np.array и транспонирует его обратно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...