Сохранить исходный тип данных при преобразовании списка в массив - PullRequest
1 голос
/ 25 марта 2019

Как сохранить исходный тип данных при преобразовании списка в массив numpy?

Я использовал np.array, np.matrix для преобразования списка в массив numpy.Но оказывается, что все int становятся строковыми.Версия Python 3.7.x.

X = [[3, 'aa', 10],                 
     [1, 'bb', 22],                      
     [2, 'cc', 28],                      
     [5, 'bb', 32],                      
     [4, 'cc', 32]]
# X is a list of list
X = np.array(X)
return X

# X becomes
[['3' 'aa' '10']
 ['1' 'bb' '22']
 ['2' 'cc' '28']
 ['5' 'bb' '32']
 ['4' 'cc' '32']]

Ответы [ 3 ]

3 голосов
/ 25 марта 2019

Другой вариант - создать структурированный массив со смесью целочисленных и строковых полей.

In [252]: import numpy.lib.recfunctions as rf 

In [258]: X = [[3, 'aa', 10],                  
     ...:      [1, 'bb', 22],                       
     ...:      [2, 'cc', 28],                       
     ...:      [5, 'bb', 32],                       
     ...:      [4, 'cc', 32]]                                                   
In [259]: dt = np.dtype('i,U10,i')                                              
In [260]: dt                                                                    
Out[260]: dtype([('f0', '<i4'), ('f1', '<U10'), ('f2', '<i4')])

В недавнем (1.16) numpy есть функция, которая преобразует неструктурированные массивы (например, строку dtype) в структурированные.:

In [261]: Y = rf.unstructured_to_structured(np.array(X), dt)                    
In [262]: Y                                                                     
Out[262]: 
array([(3, 'aa', 10), (1, 'bb', 22), (2, 'cc', 28), (5, 'bb', 32),
       (4, 'cc', 32)],
      dtype=[('f0', '<i4'), ('f1', '<U10'), ('f2', '<i4')])

Доступ к полям осуществляется по имени:

In [264]: Y['f0']                                                               
Out[264]: array([3, 1, 2, 5, 4], dtype=int32)
In [265]: Y['f1']                                                               
Out[265]: array(['aa', 'bb', 'cc', 'bb', 'cc'], dtype='<U10')

Преобразование X в список кортежей будет работать так же хорошо

In [266]: np.array([tuple(row) for row in X], dtype=dt)                         
Out[266]: 
array([(3, 'aa', 10), (1, 'bb', 22), (2, 'cc', 28), (5, 'bb', 32),
       (4, 'cc', 32)],
      dtype=[('f0', '<i4'), ('f1', '<U10'), ('f2', '<i4')])

Объектмассив и структурированный массив каждый имеет свои преимущества и недостатки.То, что лучше, будет зависеть от того, что вы собираетесь делать с массивом.В этом отношении первоначальный список может быть для многих целей таким же хорошим.Ни один из них не имеет такую ​​же скорость обработки (для математических операций), как двумерный числовой массив.

2 голосов
/ 25 марта 2019

Используйте X = np.array(X, dtype="O") вместо. Каждый элемент сохраняется как объект Python.

1 голос
/ 25 марта 2019

Вы можете использовать любой из них:

  • X = np.array(X,dtype='object')

  • X = np.array(X,dtype=object)

  • X = np.array(X, dtype='O')

Все они работают, поэтому весь код:

X = [[3, 'aa', 10],                 
     [1, 'bb', 22],                      
     [2, 'cc', 28],                      
     [5, 'bb', 32],                      
     [4, 'cc', 32]]
# X is a list of list
One you picked
return X 

PS return работает только в функции, вне функции, используйте print

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