2016-12-22 7 views
2

So platzieren Sie eine Zahlenliste in einem 2D-Nummernfeld, wobei die zweite Dimension des Arrays der Anzahl der Ziffern der größten Anzahl entspricht diese Liste? Ich möchte auch, dass die Elemente, die nicht zur ursprünglichen Zahl gehören, in jeder Reihe des zurückkehrenden Arrays Null sind.Teilen einer Zahl und Zuweisen von Elementen in einer Reihe in einem numply-Array


Beispiel:

aus der Liste a = range(0,1001), wie die numpy Array von dem unten stehenden Formular zu erhalten:

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

Bitte beachten Sie, wie das jede Zahl an Ort und Stelle platziert wird in ein np.zeros((1000,4)) Array am Ende jeder Zeile.

NB: A pythonic wird vektorisiert Implementierung

Antwort

2

Broadcasting wieder erwartet!

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:] 

Beispielläufe -

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

Danke nochmal! Das ist schön. – akilat90

2

Ein anderes Konzept 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) 

Mit @ Divakar der zufälligen Anordnung mit

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

Sie könnten 'np.max()' usw. verwenden, da die Eingabe eine Liste sein könnte. – Divakar

Verwandte Themen