Не могу сгладить массив с NumPy - PullRequest
0 голосов
/ 07 января 2019

У меня есть вывод, который выглядит следующим образом:

data = [array([1.        , 1.14112001, 0.7205845 , 1.41211849, 0.46342708,
        1.65028784, 0.24901275]),
 array([1.83665564, 0.09442164, 1.95637593, 0.01196838, 1.99991186,
        0.00822115, 1.96379539]),
 array([0.08347845, 1.85090352, 0.23174534, 1.67022918, 0.44121095,
        1.43616476])]

Это список из 3 массивов. Я должен сгладить массив. Это должно быть просто как data.flatten("F") Но это не работает

Вывод должен содержать первый элемент каждого массива, затем второй и т. Д.

что-то вроде: 1,1.83665564,1.14112001,0.09442164,1.85090352 и так далее. Как я могу это сделать

Обновление:

вывод, который я получаю с данным кодом следующим образом

array([array([1.        , 1.14112001, 0.7205845 , 1.41211849, 0.46342708,
       1.65028784, 0.24901275]),
       array([1.83665564, 0.09442164, 1.95637593, 0.01196838, 1.99991186,
       0.00822115, 1.96379539]),
       array([0.08347845, 1.85090352, 0.23174534, 1.67022918, 0.44121095,
       1.43616476])], dtype=object)

Ответы [ 3 ]

0 голосов
/ 07 января 2019

Не знаю, является ли лучшим решением, но вы можете использовать np.resize, чтобы изменить форму всех массивов до одинаковой длины и расположить их вертикально. Затем используйте .T, чтобы сгладить их на основе столбцов, и используйте маску, чтобы исключить значения, созданные np.resize:

l = max(x.size for x in data)
masks = [np.arange(l) < x.size for x in data]
np.vstack(np.resize(x, l) for x in data).T.flatten()[np.vstack(masks).T.flatten()]

>> array([1.        , 1.83665564, 0.08347845, 1.14112001, 0.09442164,
   1.85090352, 0.7205845 , 1.95637593, 0.23174534, 1.41211849,
   0.01196838, 1.67022918, 0.46342708, 1.99991186, 0.44121095,
   1.65028784, 0.00822115, 1.43616476, 0.24901275, 1.96379539])
0 голосов
/ 07 января 2019

Используйте itertools.zip_longest, чтобы получить элементы в массивах разной длины по порядку (см. этот пост ), а затем используйте списочное понимание, чтобы сгладить результирующие кортежи.

В Python 2 вместо этого мы должны использовать itertools.izip_longest.

>>> from itertools import zip_longest
>>> from numpy import array

# three sample arrays make up a list from 1 to 11
>>> data = array([array([1,4,7,10]), array([2,5,8,11]), array([3,6,9])])
>>> temp = list(zip_longest(*data, fillvalue=None))
>>> temp
[(1, 2, 3), (4, 5, 6), (7, 8, 9), (10, 11, None)]

>>> [i for tup in temp for i in tup if i is not None]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
0 голосов
/ 07 января 2019
from numpy import array
data = [array([1.        , 1.14112001, 0.7205845 , 1.41211849, 0.46342708,
        1.65028784, 0.24901275]),
 array([1.83665564, 0.09442164, 1.95637593, 0.01196838, 1.99991186,
        0.00822115, 1.96379539]),
 array([0.08347845, 1.85090352, 0.23174534, 1.67022918, 0.44121095,
        1.43616476])]
max=len(max(data,key=len))
final_list=[]
for index in range (0,max):
        final_list.extend([a[index] for a in data if len(a)>index])
print(final_list)

Выход:

[1.0, 1.83665564, 0.08347845, 1.14112001, 0.09442164, 1.85090352, 0.7205845, 1.95637593, 0.23174534, 1.41211849, 0.01196838, 1.67022918, 0.46342708, 1.99991186, 0.44121095, 1.65028784, 0.00822115, 1.43616476, 0.24901275, 1.96379539]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...