将列表列表转换为numpy数组时保留原始数据类型

时间:2019-03-25 02:59:40

标签: python list numpy

将列表列表转换为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 个答案:

答案 0 :(得分:3)

另一种选择是创建一个结构化的数组,混合使用整数和字符串字段。

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')])

对象数组和结构化数组各有优缺点。因此,哪个更好取决于您打算对数组执行的操作。因此,出于许多目的,原始列表可能同样有用。对于2D数值数组,没有一个具有相同的处理速度(用于数学运算)。

答案 1 :(得分:1)

改为使用string + integer。然后每个项目都存储为Python对象。

答案 2 :(得分:1)

您可以使用以下任何一种方式:

  • 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 

P.S。 return仅在函数中起作用,在函数之外,使用print