python - Numpy 创建具有特定位置值的矩阵

标签 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,但我似乎无法找到一种方法来做到这一点。

最佳答案

这是使用 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/

相关文章:

python - 将 2d numpy 数组连接到 3d numpy 数组

python - 如何在 Python 中使用省略号切片语法?

python - MetPy 中的 Pint Python 模块 - pint.UnitRegistry TypeError - 意外的关键字参数

python-2.7 - 在 pymc3 : how? 之外使用 pymc3 可能性/后验

Python:大 float 的小数部分

python - Theano:无法为 "shape.eval()"但不是 "np.asarray"分配内存错误

python - 使用python在文本文件中查找单词出现的第n个实例

python - 使用python连接SSH时出错

python - 查找列表中元素数量最少的所有无序分区

python - 使用 NumPy 加速数组间隔比较