Python 3.x 有没有办法在Python3中形成稀疏的n维数组?

Python 3.x 有没有办法在Python3中形成稀疏的n维数组?,python-3.x,numpy,scipy,Python 3.x,Numpy,Scipy,我对Python非常陌生,一直想知道是否有一种简单的方法可以让我在Python3中形成一个稀疏的n维数组M,主要需要以下两个条件(按照SciPy COO_矩阵): M[dim1,dim2,dim3,…]=1.0 像SciPy COO_矩阵M:M.row,M.col一样,我可能能够得到矩阵中存在非零项的所有行和列索引。在N维中,这推广到调用:M.1表示一维,M.2表示二维,依此类推 对于二维(2个条件): 这两个条件可以在N维中推广吗?我搜索了一下,发现了这个: 但这里第二个条件不满足:换句话说

我对Python非常陌生,一直想知道是否有一种简单的方法可以让我在Python3中形成一个稀疏的n维数组M,主要需要以下两个条件(按照SciPy COO_矩阵):

  • M[dim1,dim2,dim3,…]=1.0
  • 像SciPy COO_矩阵M:M.row,M.col一样,我可能能够得到矩阵中存在非零项的所有行和列索引。在N维中,这推广到调用:M.1表示一维,M.2表示二维,依此类推
  • 对于二维(2个条件):

    这两个条件可以在N维中推广吗?我搜索了一下,发现了这个:

    但这里第二个条件不满足:换句话说,我不能得到矢量化格式的所有n维索引

    还包括: 适用于python而不是python3


    在满足上述两个条件的情况下,是否有方法实现n维数组?还是我把事情复杂化了?非常感谢您的帮助:)

    本着
    coo
    格式的精神,我可以生成一个3d稀疏阵列表示:

    In [106]: dims = 2,4,6
    In [107]: data = np.zeros((10,4),int)
    In [108]: data[:,-1] = 1
    In [112]: for i in range(3):
         ...:     data[:,i] = np.random.randint(0,dims[i],10)
    
    In [113]: data
    Out[113]: 
    array([[0, 2, 3, 1],
           [0, 3, 4, 1],
           [0, 0, 1, 1],
           [0, 3, 0, 1],
           [1, 1, 3, 1],
           [1, 0, 2, 1],
           [1, 1, 2, 1],
           [0, 2, 5, 1],
           [0, 1, 5, 1],
           [0, 1, 2, 1]])
    
    这符合你的要求吗?可能有一些重复的
    sparse.coo
    在将数组转换为稠密以显示之前对重复项求和,或转换为
    csr
    以进行计算

    相应的密集阵列为:

    In [130]: A=np.zeros(dims, int)
    In [131]: for row in data:
         ...:     A[tuple(row[:3])] += row[-1]
    
    In [132]: A
    Out[132]: 
    array([[[0, 1, 0, 0, 0, 0],
            [0, 0, 1, 0, 0, 1],
            [0, 0, 0, 1, 0, 1],
            [1, 0, 0, 0, 1, 0]],
    
           [[0, 0, 1, 0, 0, 0],
            [0, 0, 1, 1, 0, 0],
            [0, 0, 0, 0, 0, 0],
            [0, 0, 0, 0, 0, 0]]])
    
    (本例中无重复项)

    使用该数据子集的二维稀疏矩阵是

    In [118]: sparse.coo_matrix((data[:,3],(data[:,1],data[:,2])),(4,6)).A
    Out[118]: 
    array([[0, 1, 1, 0, 0, 0],
           [0, 0, 2, 1, 0, 1],
           [0, 0, 0, 1, 0, 1],
           [1, 0, 0, 0, 1, 0]])
    
    这实际上是第一维的和


    我想

    M[dim1,dim2,dim3,...] = 1.0
    
    表示数组的非零元素的数据值必须为1

    Pandas具有稀疏数据系列和数据帧格式。允许非零“填充”值。我不知道多索引版本是否可以被认为高于2d。在将Pandas稀疏阵列转换为scipy稀疏阵列或从scipy稀疏阵列转换为Pandas稀疏阵列方面存在一些问题


    您当然可以创建一个基于
    coo
    (每个维度的列)或
    dok
    的数据结构。你可以用符合你条件的方式来填充它。但是,如果不进行大量编码,是否可以使用它做任何有用的事情(乘法、显示等)是一个更难的问题。首先,使用
    scipy.sparse
    2d代码演示您的条件。scipy有不同的初始化稀疏矩阵的方法,它们可以相互转换。但是你似乎在寻找一个稀疏的矩阵,但是1是任何稀疏元素的值。这根本行不通,因为稀疏矩阵的优化是基于稀疏单元格为零的事实。@hpaulj,我根据您的评论进行了编辑。希望现在更清楚一点。“我现在正在读你的答案。”鲁迪夫,我不是那个意思。M是稀疏的N维稀疏数组,非零值为1.0,所有其他值为0.0
    M[dim1,dim2,dim3,...] = 1.0