首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >scipy稀疏A[:,0] = ndarray ValueError

scipy稀疏A[:,0] = ndarray ValueError
EN

Stack Overflow用户
提问于 2020-09-11 21:39:03
回答 1查看 49关注 0票数 1

设置scipy稀疏数组A[0,:] = np.ones()的第一行工作得很好,

但是尝试用A[:,0] = np.ones()设置第一列会引发ValueError。

这是scipy 1.5.2中的一个错误,还是我没有找到描述这个问题的文档?

9月13日回答:这是一个已知的错误区域,请参阅issues/10695和最新的scipy/sparse/_index.py。然而,我还没有用这个测试过A[:,0]

代码语言:javascript
复制
""" scipy sparse A[:,0] = ndarray ValueError """
# sparse A[0,:] = ndarray works, sparse A[:,0] = ndarray raises ValueError
# https://stackoverflow.com/search?q=[scipy] [sparse-matrix] ValueError  > 100

import numpy as np
from scipy import sparse
# import warnings
# warnings.simplefilter( "ignore", sparse.SparseEfficiencyWarning )

def versionstr():
    import numpy, scipy, sys
    return "versions: numpy %s  scipy %s  python %s " % (
        numpy.__version__, scipy.__version__ , sys.version.split()[0] )

print( versionstr() )  # 11 Sep 2020: numpy 1.19.2  scipy 1.5.2  python 3.7.6

#...........................................................................
n = 3
ones = np.ones( n )

for A in [
        np.eye(n),
        sparse.eye( n ).tolil(),
        sparse.eye( n ).tocsr(),
        sparse.eye( n ).tocsr(),
        ]:
    print( "\n-- A:", type(A).__name__, A.shape )
    print( "A[0,:] = ones" )
    A[0,:] = ones
    print( "A: \n", getattr( A, "A", A ))  # dense

        # first column = ones --
    if sparse.issparse( A ):
        A[:,0] = ones.reshape( n, 1 )   # ok
        A[:,0] = np.matrix( ones ).T    # ok
        A[range(n),0] = ones            # ok
    try:
        print( "A[:,0] = ones" )
        A[:,0] = ones                   # A dense ok, A sparse ValueError
    except ValueError as msg:
        print( "ValueError:", msg )
        # ValueError: cannot reshape array of size 9 into shape (3,1)
EN

回答 1

Stack Overflow用户

发布于 2020-09-12 03:05:20

我可能会说这是一个bug,是的,这不是我所期望的行为。在幕后,这看起来像是由np.broadcast_arrays()驱动的,当填充数组是密集的时,它被调用。此函数将1d数组视为2d (1,N)数组。根据numpy切片的行为,如果大小正确,我会期望使用一维数组而不进行广播。

列切片:

代码语言:javascript
复制
>>> np.broadcast_arrays(np.ones((3,1)), A[:,0].A)
[array([[1.],
       [1.],
       [1.]]), array([[1.],
       [0.],
       [0.]])]
>>> np.broadcast_arrays(np.ones((3,)), A[:,0].A)
[array([[1., 1., 1.],
       [1., 1., 1.],
       [1., 1., 1.]]), array([[1., 1., 1.],
       [0., 0., 0.],
       [0., 0., 0.]])]
>>> np.broadcast_arrays(np.ones((1, 3)), A[:,0].A)
[array([[1., 1., 1.],
       [1., 1., 1.],
       [1., 1., 1.]]), array([[1., 1., 1.],
       [0., 0., 0.],
       [0., 0., 0.]])]

行切片:

代码语言:javascript
复制
>>> np.broadcast_arrays(np.ones((3, )), A[0, :].A)
[array([[1., 1., 1.]]), array([[1., 0., 0.]])]
>>> np.broadcast_arrays(np.ones((3, 1)), A[0, :].A)
[array([[1., 1., 1.],
       [1., 1., 1.],
       [1., 1., 1.]]), array([[1., 0., 0.],
       [1., 0., 0.],
       [1., 0., 0.]])]
>>> np.broadcast_arrays(np.ones((1, 3)), A[0, :].A)
[array([[1., 1., 1.]]), array([[1., 0., 0.]])]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63848248

复制
相关文章

相似问题

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