【问题标题】:Keep original data type when convert list of list into numpy array将列表列表转换为numpy数组时保持原始数据类型
【发布时间】:2019-03-25 02:59:40
【问题描述】:

将列表转换为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']]

【问题讨论】:

  • 你打算用这个数组做什么?

标签: python list numpy


【解决方案1】:

请改用X = np.array(X, dtype="O")。然后每个项目都存储为 Python 对象。

【讨论】:

    【解决方案2】:

    另一种选择是创建一个结构化数组,其中包含整数和字符串字段。

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

    对象数组和结构化数组各有优缺点。所以哪个更好取决于你打算用数组做什么。就此而言,出于多种目的,原始列表可能同样出色。没有一个具有与二维数值数组相同的处理速度(用于数学运算)。

    【讨论】:

      【解决方案3】:

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

      • 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 
      

      附注return只在函数内有效,在函数外,使用print

      【讨论】:

        猜你喜欢
        • 2015-11-25
        • 1970-01-01
        • 1970-01-01
        • 2017-03-08
        • 2021-12-08
        • 2021-10-22
        • 2015-01-07
        • 2016-12-25
        相关资源
        最近更新 更多