在Python中访问大量未排序的数组元素
我对Python不是很熟练。然而,我对R很在行。然而,我必须使用Python,因为它有一个与Cplex的最新接口。我还试图避免在C/C中必须进行的所有额外编码++ 也就是说,我对大型列表/数组/矩阵的速度和效率存在问题 我很快用R写了两行,虽然很难看,但效果还是不错在Python中访问大量未排序的数组元素,python,r,sparse-matrix,large-data,bigdata,Python,R,Sparse Matrix,Large Data,Bigdata,我对Python不是很熟练。然而,我对R很在行。然而,我必须使用Python,因为它有一个与Cplex的最新接口。我还试图避免在C/C中必须进行的所有额外编码++ 也就是说,我对大型列表/数组/矩阵的速度和效率存在问题 我很快用R写了两行,虽然很难看,但效果还是不错 doses = sapply(organSets[[2]], function(x) sum(voxMap_beamlet_val[which(voxMap_beamlet_iInd[,1] == x),1])) length(wh
doses = sapply(organSets[[2]], function(x) sum(voxMap_beamlet_val[which(voxMap_beamlet_iInd[,1] == x),1]))
length(which(doses <= sum(doses)/length(organSets[[2]])))/length(doses)
请告知。首先,您希望高效地访问行,而COO格式无法做到这一点。将您的
voxMapBeamlet
转换为压缩的稀疏行格式,getrow
将变得更加高效:
voxMapBeamlet = sparse.coo_matrix((voxMap_beamlet_val,(voxMap_beamlet_iInd,voxMap_beamlet_jInd)),shape=(1055736,8500))
voxMapBeamlet = voxMapBeamlet.tocsr()
其次,getDose
比它需要的复杂得多:
def getDose(voxInd):
return voxMapBeamlet.getrow(voxInd).sum()
我怀疑这已经足够快了,但我们应该能够进一步推动它。我们可以使用广播和高级索引将更多的工作从Python字节码推到C级例程中:
def probDoseLevel2(orgVox,level=None):
relevantRows = voxMapBeamlet[orgVox]
# Dense column matrix of row sums
voxDose2 = relevantRows.sum(axis=1)
if level is None:
level = voxDose2.sum()/len(orgVox)
return (voxDose2 <= level).sum() / len(orgVox)
在文件的顶部。1。这属于代码审查。2.尝试用
sum(voxDose2)
替换sum([x代表voxDose2中的x])
作为开始。感谢您的评论,我做了更改,但是在一个较小的示例上测试,如果级别没有无,那么voxDose2
是否用于任何用途?哦,谢谢,这是一个复制粘贴错误。实际上,我刚刚注意到return(voxDose2@Constantine:它做了错误的事情吗?对布尔矩阵求和应该产生一个Trues数的计数,因为它会自动转换为整数数据类型进行求和。voxDoses[voxDoses@Constantine:等等,在len中([x代表voxDose2中的x如果x抱歉,我把自己给缠住了……两者都有。最后一行是return voxDoses[voxDoses]
def probDoseLevel2(orgVox,level=None):
relevantRows = voxMapBeamlet[orgVox]
# Dense column matrix of row sums
voxDose2 = relevantRows.sum(axis=1)
if level is None:
level = voxDose2.sum()/len(orgVox)
return (voxDose2 <= level).sum() / len(orgVox)
from __future__ import division