线性化体素坐标,并将它们放入两个scipy.sparse.sparse.csc矩阵中.
设v是体素的数量,m是掩模的数量,t是轨道的数量.
令M为掩模csc矩阵,大小(m×v),其中a at(i,j)表示掩模i与体素j重叠.
令T为轨道csc矩阵,大小(t×v),其中a(k,j)表示轨道k与体素j重叠.
Overlap = (M * T.transpose() > 0) # track T overlaps mask M
Connected = (Overlap * Overlap.tranpose() > 0) # Connected masks
Density[mask_idx] = numpy.take(T,nonzero(Overlap[mask_idx,:])[0],axis=0).sum(axis=0)
我可能在最后一个错了,我不确定css_matrices可以通过非零和&采取.您可能需要在循环中拉出每列并将其转换为完整矩阵.
我做了一些试验,试图模拟我认为合理数量的数据.在2年前的MacBook上,下面的代码大约需要2分钟.如果使用csr_matrices,则大约需要4分钟.根据每首曲目的长度,可能需要权衡.
from numpy import *
from scipy.sparse import csc_matrix
nvox = 1000000
ntracks = 300000
nmask = 100
# create about 100 entries per track
tcoords = random.uniform(0,ntracks,ntracks * 100).astype(int)
vcoords = random.uniform(0,nvox,ntracks * 100).astyp