Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.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
替换Scipy(Python)创建的稀疏矩阵中的元素_Python_Scipy_Sparse Matrix - Fatal编程技术网

替换Scipy(Python)创建的稀疏矩阵中的元素

替换Scipy(Python)创建的稀疏矩阵中的元素,python,scipy,sparse-matrix,Python,Scipy,Sparse Matrix,我在Scipy中有一个巨大的稀疏矩阵,我想用一个给定的值替换其中的许多元素(比如-1) 是否有比使用以下方法更有效的方法: SM[[rows],[columns]]=-1 以下是一个例子: Nr=seg.shape[0] #size ~=50000 Im1=sparse.csr_matrix(np.append(np.array([-1]),np.zeros([1,Nr-1]))) Im1=sparse.csr_matrix(sparse.vstack([Im1,sparse.eye(Nr)

我在Scipy中有一个巨大的稀疏矩阵,我想用一个给定的值替换其中的许多元素(比如
-1

是否有比使用以下方法更有效的方法:

SM[[rows],[columns]]=-1
以下是一个例子:

Nr=seg.shape[0] #size ~=50000

Im1=sparse.csr_matrix(np.append(np.array([-1]),np.zeros([1,Nr-1])))
Im1=sparse.csr_matrix(sparse.vstack([Im1,sparse.eye(Nr)]))
Im1[prev[1::]-1,Num[1::]-1]=-1 # this line is very slow

Im2=sparse.vstack([sparse.csr_matrix(np.zeros([1,Nr])),sparse.eye(Nr)])

IM=sparse.hstack([Im1,Im2]) #final result

我已经使用了你的
稀疏
数组。我鼓励您在较小的尺寸上进行一些计时,以了解不同的方法和稀疏类型的行为。我喜欢在
Ipython
中使用
timeit

Nr=10 # seg.shape[0] #size ~=50000
Im2=sparse.vstack([sparse.csr_matrix(np.zeros([1,Nr])),sparse.eye(Nr)])
Im2
第一行为零,其余行为对角线偏移。因此,从一个空的稀疏矩阵开始更简单,尽管速度不是很快:

X = sparse.vstack([sparse.csr_matrix((1,Nr)),sparse.eye(Nr)])
或者使用
diags
直接构造偏移对角线:

X = sparse.diags([1],[-1],shape=(Nr+1, Nr))
Im1
类似,只是在
(0,0)
插槽中有一个
-1
。叠加2个对角矩阵怎么样

X = sparse.vstack([sparse.diags([-1],[0],(1,Nr)),sparse.eye(Nr)])
或者使偏移量成对角线(复制
Im2
?),并修改
[0,0]
csr
矩阵给出了效率警告,建议使用
lil
格式。不过,转换
tolil()
确实需要一些时间

让我们试试你的大插入:

prev = np.arange(Nr-2)  # what are these like?
Num = np.arange(Nr-2)
Im1[prev[1::]-1,Num[1::]-1]=-1
使用
Nr=10
,以及各种
Im1
格式:

lil - 267 us
csr - 1.44 ms
coo - not supported
todense - 25 us
好的,我选择了
prev
Num
,这样我就可以修改
Im1
的对角线。在这种情况下,从一开始就构造这些对角线会更快

X2=Im1.todia()
print X2.data
[[ 1.  1.  1.  1.  1.  1.  1.  1.  1.  1.]
 [-1. -1. -1. -1. -1. -1. -1.  0.  0.  0.]]
print X2.offsets
[-1  0]

您可能需要了解各种稀疏格式是如何存储的
csr
csc
有点复杂,设计用于快速线性代数运算
lil
dia
coo
更容易理解。

你所说的命名是什么意思?他们是如何安排的?是否要替换整行或整列?我打算替换大约40000个元素。实际上,我必须用行或列替换一个元素,它们的值相同吗?还是每次都只是一个带有随机值的孤立随机项?也许你可以提供一个例子?好的,你可以通过编辑你的问题来提供一个最简单的工作例子吗?我刚刚添加了一个例子
X2=Im1.todia()
print X2.data
[[ 1.  1.  1.  1.  1.  1.  1.  1.  1.  1.]
 [-1. -1. -1. -1. -1. -1. -1.  0.  0.  0.]]
print X2.offsets
[-1  0]