【问题标题】:Split 2D NumPy array of strings on "," character在“,”字符上拆分二维 NumPy 字符串数组
【发布时间】:2018-05-22 04:01:30
【问题描述】:

我有一个二维 NumPy 字符串数组,例如: a = array([['1,2,3'], ['3,4,5']], dtype=object) 我想将它转换成这样的二维 Numpy 数组:a = array([['1','2','3'], ['4','5','6']])。然后我还想将字符串转换为浮点数,因此最终数组将如下所示:a = array([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])。非常感谢任何帮助。

【问题讨论】:

  • 这不是一个 numpy 数组。
  • 您可能应该首先尝试将数据读入适当的 NumPy 数组,而不是像这样清理混乱。
  • 我首先将数据加载到 Pandas 数据框对象上,然后提取单个列。那不会给我一个 NumPy 数组吗?然后我重新塑造它,使它成为一个二维数组。
  • 您可能提取了一个 NumPy 数组,但您向我们展示的不是一个 NumPy 数组。我们无法通过猜测来回答您的问题。
  • 我现在是否显示了 NumPy 数组?

标签: python arrays string numpy


【解决方案1】:

既然是对象数组,我们不妨迭代使用普通的python split:

In [118]: a = np.array([['1,2,3'], ['3,4,5']], dtype=object)
In [119]: a.shape
Out[119]: (2, 1)
In [120]: np.array([x.split(',') for x in a.ravel()])
Out[120]: 
array([['1', '2', '3'],
       ['3', '4', '5']], dtype='<U1')
In [122]: np.array([x.split(',') for x in a.ravel()],dtype=float)
Out[122]: 
array([[1., 2., 3.],
       [3., 4., 5.]])

我解开它以简化迭代。另外,结果不需要第 2 尺寸 1 尺寸。

有一个np.char 函数将split 应用于数组元素,但结果比较混乱:

In [129]: a.astype(str)
Out[129]: 
array([['1,2,3'],
       ['3,4,5']], dtype='<U5')
In [130]: np.char.split(_, sep=',')
Out[130]: 
array([[list(['1', '2', '3'])],
       [list(['3', '4', '5'])]], dtype=object)
In [138]: np.stack(Out[130].ravel()).astype(float)
Out[138]: 
array([[1., 2., 3.],
       [3., 4., 5.]])

另一种方式:

In [132]: f = np.frompyfunc(lambda astr: np.array(astr.split(','),float),1,1)
In [133]: f(a)
Out[133]: 
array([[array([1., 2., 3.])],
       [array([3., 4., 5.])]], dtype=object)
In [136]: np.stack(_.ravel())
Out[136]: 
array([[1., 2., 3.],
       [3., 4., 5.]])

【讨论】:

    【解决方案2】:

    遍历行并使用split(',') 以逗号分隔每一行,并将结果放入具有数字数据类型的新 numpy 数组中:

    import numpy as np
    
    a = np.array([['1,2,3'], ['3,4,5']])
    b = np.array([x[0].split(',') for x in a], dtype=np.float32)
    print(b)
    
    #[[ 1.  2.  3.]
    # [ 3.  4.  5.]]                                          
    

    【讨论】:

      【解决方案3】:

      如果您不介意将它们作为矢量,我想提出这个建议

      np.array([["asa,asd"], ["dasd,asdaf,asfasf"]], dtype=object)
      Out[31]: 
      array([['asa,asd'],
            ['dasd,asdaf,asfasf']], dtype=object)
      np.concatenate(np.char.split(Out[31].astype(str), ",").ravel())
      Out[32]: array(['asa', 'asd', 'dasd', 'asdaf', 'asfasf'], dtype='<U6')
      

      【讨论】:

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