2016-04-19 16 views
2

Ich möchte eine spärliche Matrix mit Werten von 1 an bestimmten Standorten erstellen. Gibt es eine Möglichkeit, das in einer Menge zu tun?Numpy create matrix mit Werten an bestimmten Orten

Zum Beispiel, wenn ich eine Liste a = [6,8,8,10,10,8,8,6] habe, würde Ich mag eine Matrix der Dimensionen (len(a),max(a)) erstellen, die wie folgt aussehen:

[[0,0,1,1,1,1,1,1,0,0], 
[0,1,1,1,1,1,1,1,1,0], 
[0,1,1,1,1,1,1,1,1,0], 
[1,1,1,1,1,1,1,1,1,1], 
[1,1,1,1,1,1,1,1,1,1], 
[0,1,1,1,1,1,1,1,1,0], 
[0,1,1,1,1,1,1,1,1,0], 
[0,0,1,1,1,1,1,1,0,0], 
] 

Im Grunde ist es eine numpy.zeros((len(a),max(a))) Matrix mit Einsen in Orten ist von der Liste einer spezifiziertes .

Ich versuche Pad zu verwenden, aber ich kann nicht einen Weg finden, es zu tun.

Antwort

2

Hier ist ein vektorisiert Ansatz NumPy broadcasting mit -

arr = np.array(a) 
N = arr.max() 
Nr = np.arange(N) 
diffs = (N - arr)//2 
out = (((arr + diffs)[:,None] > Nr) & (diffs[:,None] <= Nr)).astype(int) 

Bitte beachten Sie, dass für eine ungerade Zahl in a, hätte es eine weitere Null auf der rechten Seite als eine auf der linken Seite. Hier ist ein Beispiellauf, um das zu illustrieren -

In [55]: a 
Out[55]: [6, 8, 8, 10, 10, 8, 8, 5] # last element changed to 5 

In [56]: arr = np.array(a) 
    ...: N = arr.max() 
    ...: Nr = np.arange(N) 
    ...: diffs = (N - arr)//2 
    ...: out = (((arr + diffs)[:,None] > Nr) & (diffs[:,None] <= Nr)).astype(int) 
    ...: 

In [57]: out 
Out[57]: 
array([[0, 0, 1, 1, 1, 1, 1, 1, 0, 0], 
     [0, 1, 1, 1, 1, 1, 1, 1, 1, 0], 
     [0, 1, 1, 1, 1, 1, 1, 1, 1, 0], 
     [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], 
     [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], 
     [0, 1, 1, 1, 1, 1, 1, 1, 1, 0], 
     [0, 1, 1, 1, 1, 1, 1, 1, 1, 0], 
     [0, 0, 1, 1, 1, 1, 1, 0, 0, 0]]) 
+0

Das funktioniert, danke! – Yamu

1

Eine Möglichkeit wäre - vorausgesetzt, Sie haben nur gerade Zahlen:

import numpy as np 

def func(i, m): 
    arr = np.repeat(0, (m-i)/2) 
    np.concatenate([arr, np.repeat(1, i), arr]) 

np.vstack([func(i, max(a)) for i in a]) 

Out[118]: 
array([[0, 0, 1, 1, 1, 1, 1, 1, 0, 0], 
     [0, 1, 1, 1, 1, 1, 1, 1, 1, 0], 
     [0, 1, 1, 1, 1, 1, 1, 1, 1, 0], 
     [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], 
     [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], 
     [0, 1, 1, 1, 1, 1, 1, 1, 1, 0], 
     [0, 1, 1, 1, 1, 1, 1, 1, 1, 0], 
     [0, 0, 1, 1, 1, 1, 1, 1, 0, 0]])