簡體   English   中英

向NumPy數組中的字符串添加前導零

[英]Adding leading zeros to strings in NumPy array

我有一個充滿字符串的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)] 

但這是行不通的。 有人有提示嗎?

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

如果要避免在非數字元素上添加零,則可以使用布爾數組索引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')

您可以定義一個函數,該函數填充整數/通過非整數,然后使用矢量化將其應用於整個數組。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM