【问题标题】:Converting a Numpy array with string data into integers after seperating分离后将带有字符串数据的Numpy数组转换为整数
【发布时间】:2021-12-31 21:14:29
【问题描述】:

我有这样的 numpy 数组:

myarray = array(['31,67,82', '31,72,82', '31,41,77'])

我想使用逗号作为分隔符来分割文本。然后我希望将它们转换为整数。

我试过了,

a = list()
for x in myarray:
    a.append(np.char.split(x, sep =','))

它正在工作,但是当我希望它使用 astype(np.int) 将其转换为整数时,

a = list()
for x in myarray:
    a.append(np.char.split(x, sep =',').astype(np.int)

我遇到了以下错误:

ValueError: setting an array element with a sequence.

我怎样才能做到这一点?

提前致谢!

我想要的输出是这样的:

np.array([[31,67,82] , [31,72,82],[31,41,77]])

【问题讨论】:

  • 显示不带 astype 的 a

标签: python arrays list numpy


【解决方案1】:
In [345]: myarray = np.array(['31,67,82', '31,72,82', '31,41,77'])
In [346]: myarray
Out[346]: array(['31,67,82', '31,72,82', '31,41,77'], dtype='<U8')

char.split 应用于整个数组(它实际上会迭代字符串并执行astr.split

In [347]: a = np.char.split(myarray, sep=',')
In [348]: a
Out[348]: 
array([list(['31', '67', '82']), list(['31', '72', '82']),
       list(['31', '41', '77'])], dtype=object)

我们不能将astype 应用于整个数组:

In [349]: a.astype(int)
TypeError: int() argument must be a string, a bytes-like object or a number, not 'list'

ValueError: setting an array element with a sequence.

但是如果我们创建一个列表,我们可以很容易地从中创建一个 int 数组:

In [350]: a.tolist()
Out[350]: [['31', '67', '82'], ['31', '72', '82'], ['31', '41', '77']]
In [351]: np.array(a.tolist(), int)
Out[351]: 
array([[31, 67, 82],
       [31, 72, 82],
       [31, 41, 77]])

等效地,直接进行字符串拆分:

In [352]: [astr.split(',') for astr in myarray]
Out[352]: [['31', '67', '82'], ['31', '72', '82'], ['31', '41', '77']]
In [353]: np.array([astr.split(',') for astr in myarray],int)
Out[353]: 
array([[31, 67, 82],
       [31, 72, 82],
       [31, 41, 77]])

告诉np.array 进行字符串到int 的转换应该比map(int...) 快。但是拆分本身就是一个字符串方法。

【讨论】:

    【解决方案2】:

    对使用split 函数后生成的所有元素使用map 函数并将输出再次转换为列表将是适当且有效的。试试这个:

    a = list()
    for x in myarray:
        a.append(list(map(int, x.split(','))))
    

    【讨论】:

      【解决方案3】:

      来自this 回答:

      a = list()
      for x in myarray:
          a.append(np.fromstring(x, dtype=np.int, sep=','))
      np.array(a)
      

      结果:

      array([[31, 67, 82],
             [31, 72, 82],
             [31, 41, 77]])
      

      【讨论】:

        【解决方案4】:

        预处理输入数组可能比尝试追溯修改数据类型更容易。像这样的:

        from numpy import array
        
        def process(a):
            r = []
            for item in a:
                r.append([int(x) for x in item.split(',')])
            return r
        
        myarray = array(process(['31,67,82', '31,72,82', '31,41,77']))
        print(myarray)
        

        【讨论】:

          猜你喜欢
          • 2011-03-11
          • 2022-01-01
          • 2013-05-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-05-19
          • 2021-04-26
          • 2015-03-28
          相关资源
          最近更新 更多