首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在scipy.sparse和numpy中处理不同的切片行为

在scipy.sparse和numpy中处理不同的切片行为
EN

Stack Overflow用户
提问于 2019-07-22 11:08:21
回答 1查看 141关注 0票数 0

设置

我知道,在.sparse-module中,稀疏矩阵与numpy-arrays不同。另外,我知道像here这样的关于稀疏数组切片的问题。无论如何,这个问题和大多数其他问题都涉及切片的性能。

我的问题是如何处理他们不同的切片行为。让我们创建一个示例:

代码语言:javascript
复制
import numpy as np
from scipy import sparse

matrix = np.asarray([[0,0,0,1], [1,1,0,0], [1,0,1,0], [1,0,0,1], [1,0,0,1], [1,0,0,1]])
sparse_matrix = sparse.lil_matrix(matrix) # Or another format like .csr_matrix etc.

在这种情况下,应用相同的切片会产生不同的输出:

代码语言:javascript
复制
matrix[:, 3]
# Output: 
# array([ True, False, False,  True,  True,  True], dtype=bool)

sparse_matrix[:, 3]
# Output:
# matrix([[ True],
#        [False],
#        [False],
#        [ True],
#        [ True],
#        [ True]], dtype=bool)

问题

这有点令人沮丧,因为我需要第一个输出来应用到第二个例子中。正如一开始所说的,我知道使用sparse_matrix.A等会给我想要的结果。无论如何,将稀疏矩阵转换为数组与稀疏矩阵的初始用例相矛盾.

那么,在不将sparse-matrix转换为数组的情况下,是否有可能实现相同的切片结果?

编辑:用于澄清,因为我的问题在这方面可能会混淆:sparse_matrix上的切片应该具有与matrix相同的输出,这意味着类似于sparse_matrix[:, 3]的东西将输出([ True, False, False, True, True, True])

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-22 15:27:48

代码语言:javascript
复制
In [150]: arr = np.asarray([[0,0,0,1], [1,1,0,0], [1,0,1,0], [1,0,0,1], [1,0,0,1], [1,0,0,1]]) 
     ...: M = sparse.lil_matrix(arr) # Or another format like .csr_matrix etc. 

ndarray上的标量索引将维数减少一个:

代码语言:javascript
复制
In [151]: arr[:,3]                                                                                           
Out[151]: array([1, 0, 0, 1, 1, 1])

它不改变稀疏矩阵的维数。

代码语言:javascript
复制
In [152]: M[:,3]                                                                                             
Out[152]: 
<6x1 sparse matrix of type '<class 'numpy.int64'>'
    with 4 stored elements in LInked List format>

这种行为类似于np.matrix子类(和MATLAB)。稀疏矩阵总是2d。

此矩阵的密集数组显示:

代码语言:javascript
复制
In [153]: M[:,3].A                                                                                           
Out[153]: 
array([[1],
       [0],
       [0],
       [1],
       [1],
       [1]], dtype=int64)

np.matrix显示器:

代码语言:javascript
复制
In [154]: M[:,3].todense()                                                                                   
Out[154]: 
matrix([[1],
        [0],
        [0],
        [1],
        [1],
        [1]], dtype=int64)

np.matrix具有一个A1属性,该属性生成一个一维数组(它将转换为ndarray并应用ravel):

代码语言:javascript
复制
In [155]: M[:,3].todense().A1                                                                                
Out[155]: array([1, 0, 0, 1, 1, 1], dtype=int64)

ravelsqueeze和标量索引都是减少ndarray维度的方法。但它们并不直接在np.matrix或稀疏矩阵上工作。

另一个2d稀疏矩阵的例子:

代码语言:javascript
复制
In [156]: sparse.lil_matrix(arr[:,3])                                                                        
Out[156]: 
<1x6 sparse matrix of type '<class 'numpy.int64'>'
    with 4 stored elements in LInked List format>
In [157]: _.A                                                                                                
Out[157]: array([[1, 0, 0, 1, 1, 1]], dtype=int64)

注意[[...]]sparse在一维ndarray中增加了一个领先的尺寸1维。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57144762

复制
相关文章

相似问题

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