以下是用于生成稀疏矩阵的代码:
import numpy as np import scipy def sparsemaker(X, Y, Z): 'X, Y, and Z are 2D arrays of the same size' x_, row = np.unique(X, return_inverse=True) y_, col = np.unique(Y, return_inverse=True) return scipy.sparse.csr_matrix( (Z.flat,(row,col)), shape=(x_.size, y_.size) ) >>> print sparsemaker(A, B, C) #A, B, and C are (220, 256) sized arrays. (0, 0) 167064.269831 (0, 2) 56.6146564629 (0, 9) 53.8660340698 (0, 23) 80.6529717039 (0, 28) 0.0 (0, 33) 53.2379218326 (0, 40) 54.3868995375 : :
现在我的输入数组有点大,所以我不知道如何在这里发布它们(除非任何人有任何想法);但是,即使看第一个值,我也已经知道有些错误:
>>> test = sparsemaker(A, B, C) >>> np.max(test.toarray()) 167064.26983076424 >>> np.where(C==np.max(test.toarray())) (array([], dtype=int64), array([], dtype=int64))
有谁知道为什么会这样?这种价值从何而来?
您有重复的坐标,并且构造函数将它们全部加在一起。请执行下列操作 :
x_, row = np.unique(X, return_inverse=True) y_, col = np.unique(Y, return_inverse=True) print Z.flat[(row == 0) & (col == 0)].sum()
然后应该把那神秘的东西167064.26983076424打印出来。
167064.26983076424
编辑下面的丑陋代码可以很好地用小示例平均重复项,并从其他问题中借用一些代码,请尝试一下:
def sparsemaker(X, Y, Z): 'X, Y, and Z are 2D arrays of the same size' x_, row = np.unique(X, return_inverse=True) y_, col = np.unique(Y, return_inverse=True) indices = np.array(zip(row, col)) _, repeats = np.unique(indices.view([('', indices.dtype)]*2), return_inverse=True) counts = 1. / np.bincount(repeats) factor = counts[repeats] return scipy.sparse.csr_matrix((Z.flat * factor,(row,col)), shape=(x_.size, y_.size))