Numpy使用特定位置的值创建矩阵

时间:2016-04-19 14:58:01

标签: python numpy

我想在特定位置创建值为1的稀疏矩阵。有没有办法在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)))矩阵,其中一个位于列表a。

指定的位置

我正在尝试使用pad,但我似乎无法找到一种方法来实现它。

2 个答案:

答案 0 :(得分: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]])

答案 1 :(得分: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]])