Список для массива с разными столбцами в одной строке python

Мне нужно преобразовать список в массив. Но функция asarray не генерирует желаемый результат, вы знаете, как сделать преобразование? Благодарю!

список:

[[1,2],[4,5,6]]

преобразовать в массив:

[[1,2,""],
[4,5,6]]
2 ответа

Требуемый массив NumPy должен иметь object dtype. Такие массивы не имеют ни одного из преимуществ скоростей массивов NumPy с родными типами. Вы можете изменить свою цель.

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

In [50]: import itertools as IT

In [51]: seq = [[1,2],[4,5,6]]

In [52]: np.array(zip(*(IT.izip_longest(*seq, fillvalue=''))), dtype='O')
Out[52]: 
array([[1, 2, ''],
 [4, 5, 6]], dtype=object)

(Спасибо @m.wasowski, за zip вместо list(IT.izip(...)) улучшение.)

Идея @utdemir о том, чтобы использовать -1 в качестве заполнителя, позволила бы вам создать массив numpy из собственного int dtype. Используя вышеприведенный код, все, что вам нужно изменить, это fillvalue -1:

In [56]: np.array(zip(*(IT.izip_longest(*seq, fillvalue=-1))))
Out[56]: 
array([[ 1, 2, -1],
 [ 4, 5, 6]])

Другой вариант - использовать массив с маской в NumPy:

In [68]: np.ma.masked_less(zip(*(IT.izip_longest(*seq, fillvalue=-1))), 0)
Out[68]: 
masked_array(data =
 [[1 2 --]
 [4 5 6]],
 mask =
 [[False False True]
 [False False False]],
 fill_value = 999999)

Маскированный массив позволит вам выполнять вычисления NumPy при правильной обработке отсутствующих данных. Например, среднее значение столбцов можно найти таким образом:

In [71]: print(arr.mean(axis=0))
[2.5 3.5 6.0]

Обратите внимание, что среднее значение последнего столбца равно 6, а не 3.


Ну, похоже, вы должны делать вручную.

>>> s = [[1,2], [4,5,6]]
>>> maxl = max(map(len, s))
>>> np.asarray([i + [-1]*(maxl-len(i)) for i in s])
array([[ 1, 2, -1],
 [ 4, 5, 6]])

Но массивы numpy являются однородными, поэтому вы не можете иметь строку и int в массиве; поэтому я использовал -1 в качестве заполнителя.

licensed under cc by-sa 3.0 with attribution.