在Python中访问大量未排序的数组元素

在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

我对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(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