gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 04:41:05 26 4
gpt4 key购买 nike

我对 Python 不太熟练。不过,我对 R 非常熟悉。然而,我必须使用 Python,因为它具有与 Cplex 的最新接口(interface)。我还试图避免在 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)

...这些行的执行时间约为 5 分钟,其中 length(organSets[[2]])=52960length(voxMap_beamlet_val) = length(voxMap_beamlet_iInd) = 1217077

然而,在Python中,类似的事情大约需要两个小时。通过使用 scipy.sparse,执行时间减少了一半,大约一个小时......这显然仍然是 Not Acceptable ......

Python代码如下...

voxMapBeamlet = sparse.coo_matrix((voxMap_beamlet_val,(voxMap_beamlet_iInd,voxMap_beamlet_jInd)),shape=(1055736,8500))
def getDose(voxInd):
return sum([x.sum() for x in voxMapBeamlet.getrow(voxInd)])

def probDoseLevel2(orgVox,level=None):
voxDose2 = [0] * len(orgVox)
for i,v in enumerate(orgVox):
voxDose2[i] = getDose(v)
if level == None:
level = sum(voxDose2)/len(orgVox)
print len([x for x in voxDose2 if x <= level])/len(orgVox)

probDoseLevel2(organSets[1])

请指教。

最佳答案

首先,您需要高效地访问行,而 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)

最后,如果您使用的是 Python 2,则最后一行的除法是整数除法。这里总是会产生 0 或 1,因为 len(orgVox) 至少与分子一样大。生成 level 的除法可能存在类似的问题,具体取决于您正在使用的数据的数据类型。要打开真除法,您可以输入

from __future__ import division

位于文件顶部。

关于python - 在Python中访问大量未排序的数组元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30699806/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com