【问题标题】:scipy sparse A[:,0] = ndarray ValueErrorscipy 稀疏 A[:,0] = ndarray ValueError
【发布时间】:2020-12-30 01:07:53
【问题描述】:

设置 scipy 稀疏数组的第一行 A[0,:] = np.ones() 工作正常,
但是尝试使用A[:,0] = np.ones() 设置第一列会引发ValueError。
这是 scipy 1.5.2 中的错误,还是我没有找到描述这个的文档?

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

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

【问题讨论】:

    标签: indexing scipy sparse-matrix valueerror


    【解决方案1】:

    我可能会称这是一个错误,是的 - 这不是我所期望的行为。在引擎盖下,它看起来像是由np.broadcast_arrays() 驱动的,当填充数组密集时调用它。此函数将 1d 数组视为 2d (1, N) 数组。根据 numpy 切片的行为,如果大小正确,我会期望在不广播的情况下使用一维数组。

    列切片:

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

    行切片:

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

    【讨论】:

      猜你喜欢
      • 2013-11-13
      • 2015-04-18
      • 2018-01-11
      • 2011-02-02
      • 1970-01-01
      • 2017-03-26
      • 2017-03-31
      • 2012-08-20
      • 1970-01-01
      相关资源
      最近更新 更多