Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Numpy使用特定位置的值创建矩阵_Python_Numpy - Fatal编程技术网

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

Python Numpy使用特定位置的值创建矩阵,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的稀疏矩阵。在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.zero((len(a),max(a))
矩阵,其中1位于列表a指定的位置


我正在尝试使用pad,但我似乎想不出一个办法

如果您只有偶数,则有一种方法:

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

这里有一个矢量化方法,使用-

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