Python 3.x 有没有办法在Python3中形成稀疏的n维数组?
我对Python非常陌生,一直想知道是否有一种简单的方法可以让我在Python3中形成一个稀疏的n维数组M,主要需要以下两个条件(按照SciPy COO_矩阵):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维中推广吗?我搜索了一下,发现了这个: 但这里第二个条件不满足:换句话说
在满足上述两个条件的情况下,是否有方法实现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