2016-12-22 3 views
2

Как поместить список чисел в массив 2D numpy, где второе измерение массива равно числу цифр наибольшего числа этот список? Я также хочу, чтобы элементы, не принадлежащие исходному числу, были равны нулю в каждой строке возвращаемого массива.Разбиение номера и присвоение элементам строки в массиве numpy


Пример:

Из списка a = range(0,1001), как получить Numpy массив с помощью следующей формы:

[[0,0,0,0], 
[0,0,0,1], 
[0,0,0,2], 
... 
[0,9,9,8] 
[0,9,9,9], 
[1,0,0,0]] 

Пожалуйста, обратите внимание, как каждый номер помещается на месте в a np.zeros((1000,4)) массив в конце каждой строки.

NB: A вещий, векторизация реализация ожидается

ответ

2

Broadcasting снова!

def split_digits(a): 
    N = int(np.log10(np.max(a))+1) # No. of digits 
    r = 10**np.arange(N,-1,-1) # 10-powered range array 
    return (np.asarray(a)[:,None]%r[:-1])//r[1:] 

Примеры пробеги -

In [224]: a = range(0,1001) 

In [225]: split_digits(a) 
Out[225]: 
array([[0, 0, 0, 0], 
     [0, 0, 0, 1], 
     [0, 0, 0, 2], 
     ..., 
     [0, 9, 9, 8], 
     [0, 9, 9, 9], 
     [1, 0, 0, 0]]) 

In [229]: a = np.random.randint(0,1000000,(7)) 

In [230]: a 
Out[230]: array([431921, 871855, 636144, 541186, 410562, 89356, 476258]) 

In [231]: split_digits(a) 
Out[231]: 
array([[4, 3, 1, 9, 2, 1], 
     [8, 7, 1, 8, 5, 5], 
     [6, 3, 6, 1, 4, 4], 
     [5, 4, 1, 1, 8, 6], 
     [4, 1, 0, 5, 6, 2], 
     [0, 8, 9, 3, 5, 6], 
     [4, 7, 6, 2, 5, 8]]) 
+1

Еще раз спасибо! Это прекрасно. – akilat90

2

Другая концепция использования pandasstr

def pir(a): 
    z = int(np.log10(np.max(a))) 
    s = pd.Series(a.astype(str)) 
    zfilled = s.str.zfill(z + 1).sum() 
    a_ = np.array(list(zfilled)).reshape(-1, z + 1) 
    return a_.astype(int) 

Использование @ случайного массива Divakar в

a = np.random.randint(0,1000000,(7)) 

array([ 57190, 29950, 392317, 592062, 460333, 639794, 983647]) 

pir(a) 

array([[0, 5, 7, 1, 9, 0], 
     [0, 2, 9, 9, 5, 0], 
     [3, 9, 2, 3, 1, 7], 
     [5, 9, 2, 0, 6, 2], 
     [4, 6, 0, 3, 3, 3], 
     [6, 3, 9, 7, 9, 4], 
     [9, 8, 3, 6, 4, 7]]) 
+1

Возможно, вы захотите использовать 'np.max()' и т. Д., Поскольку вход может быть списком. – Divakar

Смежные вопросы