向 NumPy 数组中的字符串添加前导零

N.W*_*.W. 1 python arrays string numpy

我有一个充满字符串的 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)] 
Run Code Online (Sandbox Code Playgroud)

但这行不通。有人有什么建议吗?

Geo*_*rgy 5

NumPy 对于字符串数组有几个有用的函数。请参阅有关字符串操作的 NumPy 文档。您正在寻找的函数是np.core.defchararray.zfill或其别名 np.char.zfill

David Buck 的答案中的一个数组为例:

>>> 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')
Run Code Online (Sandbox Code Playgroud)

如果您想避免向非数字元素添加零,我们可以使用布尔数组索引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')
Run Code Online (Sandbox Code Playgroud)