首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用scipy.sparse vstack

如何使用scipy.sparse vstack
EN

Stack Overflow用户
提问于 2017-12-06 14:48:01
回答 2查看 3.1K关注 0票数 0

我有一个v堆栈,它由两个不同的矩阵组成。

代码语言:javascript
复制
im = imread('input.jpg')
dxy = spnabla(im.shape[0], im.shape[1])
def spnabla(M, N):
    dx = spnabla_x(M, N)
    dy = spnabla_y(M, N)
    dxy = sp.vstack((dx, dy))
    return dxy

def spnabla_x(M, N):
    a = np.append(np.ones(N-1), 0)
    dx = sp.diags([np.tile(-a, M), np.tile(a, M)], [0, 1], (M*N, M*N))
    return dx.tocsr()

def spnabla_y(M, N):
    b = np.append(np.tile(np.ones(N), M-1), np.zeros(N))
    dy = sp.diags([-b, b], [0, N], (M*N,M*N))
    return dy.tocsr()

如何在dxy v堆栈中访问dx和dy?我想把dx和dy作为图像显示。这有可能吗?

谢谢你的帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-12-06 18:42:15

sp.vstack垂直连接矩阵,就像np.vstack那样(除了它与组件集的coo属性一起工作)。

代码语言:javascript
复制
In [93]: dx = spnabla_x(10,10)
In [94]: dy = spnabla_y(10,10)
In [95]: dx
Out[95]: 
<100x100 sparse matrix of type '<class 'numpy.float64'>'
    with 180 stored elements in Compressed Sparse Row format>
In [96]: dy
Out[96]: 
<100x100 sparse matrix of type '<class 'numpy.float64'>'
    with 180 stored elements in Compressed Sparse Row format>
In [97]: dx.A
Out[97]: 
array([[-1.,  1.,  0., ...,  0.,  0.,  0.],
       [ 0., -1.,  1., ...,  0.,  0.,  0.],
       [ 0.,  0., -1., ...,  0.,  0.,  0.],
       ..., 
       [ 0.,  0.,  0., ..., -1.,  1.,  0.],
       [ 0.,  0.,  0., ...,  0., -1.,  1.],
       [ 0.,  0.,  0., ...,  0.,  0.,  0.]])
In [98]: dy.A
Out[98]: 
array([[-1.,  0.,  0., ...,  0.,  0.,  0.],
       [ 0., -1.,  0., ...,  0.,  0.,  0.],
       [ 0.,  0., -1., ...,  0.,  0.,  0.],
       ..., 
       [ 0.,  0.,  0., ...,  0.,  0.,  0.],
       [ 0.,  0.,  0., ...,  0.,  0.,  0.],
       [ 0.,  0.,  0., ...,  0.,  0.,  0.]])
In [99]: dxy = sp.vstack((dx,dy))
In [100]: dxy
Out[100]: 
<200x100 sparse matrix of type '<class 'numpy.float64'>'
    with 360 stored elements in Compressed Sparse Row format>

In [101]: dxy
Out[101]: 
<200x100 sparse matrix of type '<class 'numpy.float64'>'
    with 360 stored elements in Compressed Sparse Row format>
In [102]: np.allclose(dxy[:100,:].A,dx.A)

因此,N的第一个dxy行与dx等行相同。我应该警告,稀疏矩阵的索引比常规的numpy数组要慢得多。它不创建一个view;它是一个新的矩阵,它有自己的数据。除非您需要对整个dxy做一些计算,否则堆叠dxdy没有多大意义。

票数 2
EN

Stack Overflow用户

发布于 2019-08-12 16:52:34

@hpaulj的答案是正确的,但这个bug或功能只是咬了我一口:

sparse.vstack(( csr, csr )) -> csr,但是

sparse.vstack((任何其他)) -> coo !?

这里有一个小小的测试平台来展示这一点:

代码语言:javascript
复制
"""print the types of A op B for A, B scipy.sparse csr, csc, lil """
from __future__ import print_function
import sys
import numpy as np
import scipy
from scipy import sparse

print( "\n" + 80 * "=" )
print( "versions: numpy %s  scipy %s  python %s \n" % (
        np.__version__, scipy.__version__, sys.version.split()[0] ))

I = np.eye( 3 )
As = [ sparse.csr_matrix(I),
    sparse.csc_matrix(I),
    sparse.lil_matrix(I) ]

def binop_types( binop, As=As, Bs=As ):
    """ print the types of A op B for A in As, B in Bs """
    for A in As:
        for B in Bs:
            AopB = binop( A, B )
            print( "%s %s -> %s " % (
                type(A).__name__,
                type(B).__name__,
                type(AopB).__name__ ))

def hstackop( A, B ):
    return sparse.hstack(( A, B ))
def vstackop( A, B ):
    return sparse.vstack(( A, B ))

print( __doc__ )
print( "\n-- vstack --" )
binop_types( vstackop )

print( "\n-- hstack --" )
binop_types( hstackop )

print( "\n-- + --" )
binop_types( lambda A, B: A + B )   
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47677065

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档