Как добавить начальные нули ко всем элементам массива? - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть массив numpy:

   [[4907., 4907., 4907., ..., 4907., 4907., 4907.],
   [4907., 4907., 4907., ..., 4907., 4907., 4907.],
   [4907., 4907., 4907., ..., 4907., 4907., 4907.]]

I wi sh для добавления указанного c числа ведущих нулей к каждому элементу этого массива, чтобы массив выглядел следующим образом :

  [[0004907., 0004907., 0004907., ..., 0004907., 0004907., 0004907.],
   [0004907., 0004907., 0004907., ..., 0004907., 0004907., 0004907.],
   [0004907., 0004907., 0004907., ..., 0004907., 0004907., 0004907.]]

Какой самый эффективный и быстрый способ сделать это?

Ответы [ 2 ]

1 голос
/ 01 апреля 2020

Это невозможно сделать. Интерпретатор Python автоматически преобразует числа типа 0004 в 4.

Единственный способ сделать это - преобразовать все в строку. Если вы хотите сделать математику с содержимым вашего массива, вы конвертируете его обратно в число с плавающей точкой.

arr = [
    [4907., 4907., 4907.],
    [4907., 4907., 4907.],
    [4907., 4907., 4907.]
]

new_arr = []

for i in range(0, len(arr)):
    new_arr.append([])
    for j in range(0, len(arr)):
        nr = arr[i][j]
        new_arr[i].append(str(nr).zfill(len(str(nr)) + 3))


print(new_arr)


Вывод:

[['0004907.0', '0004907.0', '0004907.0'], ['0004907.0', '0004907.0', '0004907.0'], ['0004907.0', '0004907.0', '0004907.0']]

Редактировать: Однако, если Вы должны использовать этот массив много, самый элегантный способ достигнуть этого - создать класс, по моему мнению. Это будет более естественно, и вам не придется каждый раз переходить между строками и плавать. Таким образом, будучи также быстрее.

#Special class
class SpecialArray:
    #Your array
    arr = [
        [4907., 4907., 4907.],
        [4907., 4907., 4907.],
        [4907., 4907., 4907.]
    ]


    #Append leading zero's when class is initiated
    def __init__(self):
        temp_arr = []

        for i in range(0, len(self.arr)):
            temp_arr.append([])
            for j in range(0, len(self.arr)):
                nr = self.arr[i][j]
                temp_arr[i].append(str(nr).zfill(len(str(nr)) + 3))

        self.arr = temp_arr

    #Print out array
    def print(self):
        print(self.arr)

    #Get a value to to math
    #If asString is true, you get back the string with leading zero's (not for math)
    def get(self, x, y, asString = False):
        if not asString:
            return float(self.arr[x][y])
        else:
            return self.arr[x][y]

    #TODO: Make function to append etc here

###Rest of your program
def main():
    #Initiate your array
    arr = SpecialArray()

    #Print out whole array
    arr.print()
    #Output:
    #[['0004907.0', '0004907.0', '0004907.0'], ['0004907.0', '0004907.0', '0004907.0'], ['0004907.0', '0004907.0', '0004907.0']]


    #Print out one element
    print(arr.get(1, 2, True))
    #Output:
    #0004907.0

    #Get one element and increase by one (do math)
    x = arr.get(1,2) + 1
    print(x)
    #Output:
    #4908.0

main()


0 голосов
/ 02 апреля 2020

С помощью одного из Python методов форматирования строки мы можем создать простую функцию, которая дополняет число до 7 мест:

Отображение числа с ведущими нулями

def foo(num):
    return "{:07d}".format(num)
In [301]: arr = [[4907, 12],[1, 4907]]                                                         

и используйте frompyfunc, чтобы применить это ко всем элементам массива:

In [302]: np.frompyfunc(foo,1,1)(arr)                                                          
Out[302]: 
array([['0004907', '0000012'],
       ['0000001', '0004907']], dtype=object)

===

Вам не нужно frompyfunc, если вы просто писать это в CSV. Просто укажите желаемый fmt:

In [359]: np.savetxt('padded.txt', arr, fmt="%07d")                                            
In [360]: cat padded.txt                                                                       
0004907 0000012
0000001 0004907
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...