我想创建一个在特定位置值为 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,但我似乎无法找到一种方法来做到这一点。
最佳答案
这是使用 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]])
关于python - Numpy 创建具有特定位置值的矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36722119/