【问题标题】:Adding leading zeros to strings in NumPy array将前导零添加到 NumPy 数组中的字符串
【发布时间】:2019-08-17 23:15:06
【问题描述】:

我有一个用字符串填充的 3 维数组,主要是数字,但也有一些文本。如果一个字符串只包含一个数字(即 1、5),我想给它加一个零(01、05、14 等)。不过,我无法让它适用于我的 NumPy 数组。

我尝试过(除其他外):

strlist = ['1','2','3','4','5','6','7','8','9']
arr[np.isin(arr, strlist)] = '0' + arr[np.isin(arr, strlist)] 

但这不起作用。有没有人有任何提示?

【问题讨论】:

    标签: python arrays string numpy


    【解决方案1】:

    NumPy 有几个对字符串数组有用的函数。见NumPy docs on String operations。您正在寻找的功能是np.core.defchararray.zfill 或其alias np.char.zfill。

    以David Buck's answer 中的数组为例:

    >>> import numpy as np
    >>> arr = np.array([[['3', '6', '12'],
                         ['0', '1', '3'],
                         ['5', 'T', '8'],
                         ['19', '15', '11']],
                        [['6', '3', '1'],
                         ['10', '10', 'QR'],
                         ['7', '11', '9'],
                         ['12', '13', '11']],
                        [['1', 'G', '3'],
                         ['10', '9', '2'],
                         ['18', '12', '17'],
                         ['6', '1', '10']]])
    >>> np.char.zfill(arr, 2)
    array([[['03', '06', '12'],
            ['00', '01', '03'],
            ['05', '0T', '08'],
            ['19', '15', '11']],
    
           [['06', '03', '01'],
            ['10', '10', 'QR'],
            ['07', '11', '09'],
            ['12', '13', '11']],
    
           [['01', '0G', '03'],
            ['10', '09', '02'],
            ['18', '12', '17'],
            ['06', '01', '10']]], dtype='<U2')
    

    如果你想避免给非数字元素添加零,我们可以使用boolean array indexing和np.core.defchararray.isdigit函数或其别名np.char.isdigit:

    >>> mask = np.char.isdigit(arr)
    >>> mask
    array([[[ True,  True,  True],
            [ True,  True,  True],
            [ True, False,  True],
            [ True,  True,  True]],
    
           [[ True,  True,  True],
            [ True,  True, False],
            [ True,  True,  True],
            [ True,  True,  True]],
    
           [[ True, False,  True],
            [ True,  True,  True],
            [ True,  True,  True],
            [ True,  True,  True]]])
    >>> arr[mask] = np.char.zfill(arr[mask], 2)
    >>> arr
    array([[['03', '06', '12'],
            ['00', '01', '03'],
            ['05', 'T', '08'],
            ['19', '15', '11']],
    
           [['06', '03', '01'],
            ['10', '10', 'QR'],
            ['07', '11', '09'],
            ['12', '13', '11']],
    
           [['01', 'G', '03'],
            ['10', '09', '02'],
            ['18', '12', '17'],
            ['06', '01', '10']]], dtype='<U2')
    

    【讨论】:

      【解决方案2】:

      您可以定义一个填充整数/传递非整数的函数,然后使用矢量化将其应用于整个数组。

      import numpy as np
      
      def pad(value):
          try:
              return '{0:0>2}'.format(int(value))
          except:
              return value
      
      vfunc = np.vectorize(pad)
      arr = vfunc(arr)
      print(arr)
      

      将其应用于以下输入:

      arr = np.array([[['3', '6', '12'],
                       ['0', '1', '3'],
                       ['5', 'T', '8'],
                       ['19', '15', '11']],
                      [['6', '3', '1'],
                       ['10', '10', 'QR'],
                       ['7', '11', '9'],
                       ['12', '13', '11']],
                      [['1', 'G', '3'],
                       ['10', '9', '2'],
                       ['18', '12', '17'],
                       ['6', '1', '10']],])
      

      返回

      [[['03' '06' '12']
        ['00' '01' '03']
        ['05' 'T' '08']
        ['19' '15' '11']]
       [['06' '03' '01']
        ['10' '10' 'QR']
        ['07' '11' '09']
        ['12' '13' '11']]
       [['01' 'G' '03']
        ['10' '09' '02']
        ['18' '12' '17']
        ['06' '01' '10']]]
      

      【讨论】:

        猜你喜欢
        • 2018-11-09
        • 2017-08-12
        • 1970-01-01
        • 1970-01-01
        • 2011-02-03
        • 1970-01-01
        • 2020-08-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多