Как преобразовать список numpy массивов с пустыми массивами в единый массив? - PullRequest
1 голос
/ 07 мая 2020

Итак, мои данные выглядят так:

[array([0], dtype=int64),
 array([1], dtype=int64),
 array([1], dtype=int64),
 array([2], dtype=int64),
 array([3], dtype=int64),
 array([3], dtype=int64),
 array([4], dtype=int64),
 array([], dtype=int64),
 array([], dtype=int64),
 array([], dtype=int64),
 array([], dtype=int64),
 array([], dtype=int64),
 array([], dtype=int64),
 array([], dtype=int64),
 array([], dtype=int64),
 array([], dtype=int64),
 array([], dtype=int64),
 array([], dtype=int64),
 array([], dtype=int64),
 array([], dtype=int64),
 array([6], dtype=int64) ...

При использовании np.concatenate(list_1) объединяет массивы, но пропускает пустые массивы. И в этом результирующий массив 6 является следующим элементом после 4, и промежуточные пустые массивы не появляются в списке. Это то, что делает np.concateneate, но я не хочу этого.

Я хочу объединить эти массивы в один массив, имеющий ту же длину, что и список, но значения NaN вместо пустых массивы. Как этого добиться?

Ответы [ 2 ]

2 голосов
/ 07 мая 2020

В одну сторону:

np.concatenate([a if a.size else np.array([np.nan]) for a in array_list])

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

В качестве примечания, concatenate не пропускает ни одного array - объединяет массивы, то есть помещает элементы один за другим. Размещение 0 элементов просто незаметно.

0 голосов
/ 07 мая 2020

Вы можете предварительно выделить вывод и назначить ему напрямую:

result = np.full(len(list_1), np.nan)
for i, v in enumerate(list_1):
    if v.size:
        result[i] = v.item()

В качестве альтернативы вы можете сделать

result = np.empty(len(list_1))
for i, v in enumerate(list_1):
    result[i] = v.item() if v.size else np.nan
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...