2016-04-19 82 views
2

我想在特定位置創建值爲1的稀疏矩陣。有沒有辦法做到這一點在numpy?Numpy使用特定位置的值創建矩陣

舉例來說,如果我有一個列表a = [6,8,8,10,10,8,8,6],我想創建維度(len(a),max(a))看起來的矩陣,如:

[[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], 
] 

基本上它是一個numpy.zeros((len(a),max(a)))矩陣與那些在位置由列表中的指定。

我想使用墊,但我似乎無法找出一種方法來做到這一點。

回答

2

下面是使用NumPy broadcasting一個量化的方法 -

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) 

請注意,在a奇數,那就得右側的一個零比左側多一個。這裏有一個示例運行說明 -

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

This Works,thanks! – Yamu

1

將是單向的 - 只要你只有偶數:

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