2016-12-22 10 views
2

2次元numpy配列に数値のリストを配置する方法。配列の2番目の次元は最大の桁数そのリスト?また、元の数値に属していない要素を、返される配列の各行でゼロにしたいとします。数値を分割してnumpy配列の行の要素に割り当てる


例:以下のフォームのnumpyの配列を取得する方法をリストa = range(0,1001)から、

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

各番号はでその場で置かれているかに注意してください各行の末尾に配列np.zeros((1000,4))があります。

NB:ニシキヘビ、ベクトル化実装が再び

答えて

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

Divakarのランダムな配列@使用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) 

を使用して別の概念

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

関連する問題