我对Python很新,并且一直想知道是否有一种简单的方法可以在Python3中形成一个稀疏的n维数组M,主要需要以下2个条件(沿着SciPy COO_Matrix的行):
对于二维(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维数组?或者我过于复杂了?我很感激任何帮助:)
答案 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