Добавление лидирующих нулей в строки в массиве NumPy - PullRequest
0 голосов
/ 27 марта 2019

У меня есть трехмерный массив, заполненный строками, в основном из чисел, но также и с некоторым текстом. Если строка содержит только одну цифру (т.е. 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)] 

Но это не работает. У кого-нибудь есть советы?

Ответы [ 2 ]

4 голосов
/ 27 марта 2019

NumPy имеет несколько полезных функций для массивов строк. См. Документация NumPy по операциям со строками . Функция, которую вы ищете: np.core.defchararray.zfill или псевдоним np.char.zfill.

Взяв примерный массив из Ответ Дэвида Бака :

>>> 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')
2 голосов
/ 27 марта 2019

Вы можете определить функцию, которая дополняет целые числа / передает не целые числа, а затем использует vectorize, чтобы применить ее ко всему массиву.

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']]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...