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

时间:2017-03-16 22:37:01

标签: python-3.x numpy scipy

我对Python很新,并且一直想知道是否有一种简单的方法可以在Python3中形成一个稀疏的n维数组M,主要需要以下2个条件(沿着SciPy COO_Matrix的行):

  1. M [dim1,dim2,dim3,...] = 1.0
  2. 与SciPy COO_Matrix M:M.row,M.col一样,我可以获得矩阵中存在非零条目的所有行和列索引。在N维中,这概括为:第一维M.1,第二维M.2等等......
  3. 对于二维(2个条件):

     1.
         for u, i in data:
            mat[u, i] = 1.0
    
     2. def get_triplets(mat):
            return mat.row, mat.col
    

    这两个条件能否在N维中推广?我搜索并发现了这个:

    sparse 3d matrix/array in Python?

    但是第二个条件不满足:换句话说,我无法以矢量化格式获得所有第n维索引。

    另外这个: http://www.janeriksolem.net/sparray-sparse-n-dimensional-arrays-in.html适用于python而不适用于python3。

    有没有办法实现满足上述2个条件的n维数组?或者我过于复杂了?我很感激任何帮助:)

1 个答案:

答案 0 :(得分:1)

本着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]]])

(在这种情况下没有重复)。

使用此数据子集的2d稀疏矩阵

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稀疏数据的问题,有几个问题。

Convert Pandas SparseDataframe to Scipy sparse csc_matrix

http://pandas-docs.github.io/pandas-docs-travis/sparse.html#interaction-with-scipy-sparse