Разбить целое число на цифры, используя NumPy - PullRequest
0 голосов
/ 26 июня 2018

У меня есть вопрос. Вопрос задавался раньше, но, насколько я понимаю, никогда не использовал numpy. Я хочу разделить значение на разные цифры. сделай что-нибудь и вернись обратно в число. основываясь на вопросах ниже, я могу делать то, что хочу. Но я предпочитаю делать все это в тупик. Я ожидаю, что это более эффективно, потому что я не перехожу назад и вперед к массивам. Смотрите пример:

Пример:

import numpy as np


l = np.array([43365644])  # is input array
n = int(43365644)
m = [int(d) for d in str(n)]
o = np.aslist(np.sort(np.asarray(m)))
p = np.asarray(''.join(map(str,o)))

Я пробовал сервал раз, но без особой удачи. У меня был один момент, когда я использовал функцию split, и она работала (в терминале), но после добавления его в сценарий снова произошел сбой, и я не смог воспроизвести то, что делал раньше ..

q = np.sort(np.split(l,1),axis=1) без ошибок, но это все еще одиночное значение.

q = np.sort(np.split(l,8),axis=1) С помощью этого метода выдает следующую ошибку:

Traceback (most recent call last):
File "python", line 1, in <module>
ValueError: array split does not result in an equal division

Есть ли способ, которым это возможно в numpy? заранее спасибо

ссылки на вопросы:
Превратить одно число в однозначные числа Python
Преобразовать список целых чисел в одно число?

1 Ответ

0 голосов
/ 26 июня 2018

Довольно просто:

  1. Разделите свое число на 1, 10, 100, 1000, ... округляя вниз
  2. По модулю результата на 10

, что дает

l // 10 ** np.arange(10)[:, None] % 10

Или, если вы хотите решение, которое работает для

  • любой базы
  • любое количество цифр и
  • любое количество размеров

можно сделать

l = np.random.randint(0, 1000000, size=(3, 3, 3, 3))
l.shape
# (3, 3, 3, 3)

b = 10                                                   # Base, in our case 10, for 1, 10, 100, 1000, ...
n = np.ceil(np.max(np.log(l) / np.log(b))).astype(int)   # Number of digits
d = np.arange(n)                                         # Divisor base b, b ** 2, b ** 3, ...
d.shape = d.shape + (1,) * (l.ndim)                      # Add dimensions to divisor for broadcasting
out = l // b ** d % b

out.shape
# (6, 3, 3, 3, 3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...