给定一个numpy数组,我试图找出每个元素对的差异,条件是差异应该小于1000000,大于-1000000
pairWiseDiff = np.array([])
for ts in timestamps:
diffTime = timestamps - ts
individualTimeDiff = diffTime[np.logical_and(diffTime<1000000.0, diffTime>-1000000.0)]
pairWiseDiff = np.append(pairWiseDiff, individualTimeDiff)
此脚本适用于输入数组长度小于40000的用例。但是,我想得到长度为150000的数组的结果,上面的脚本非常慢。在
提高速度的建议?在
假设}。在
timestamps
是1d。滥用(a-b) = -(b-a)
和{编辑:对于n-d数组
^{pr2}$编辑2:对于内存问题,您可能需要将
^{3}$diffs
和mask
计算组合起来。您可以使用mem
来一次尽可能多地放入内存中。在根据} 或{a2}对象。在
mask
的稀疏程度、处理异常的方式或正在进行的后续计算,您可能希望跳过生成out
(就像我对内存节省版本所做的那样)和return i[mask], j[mask], diffs[mask]
。也可以将out
改为^{这将减少从
O(n^2)
到O(n*(n-1)/2)
的计算次数,并消除许多for
循环。在如果时间戳中只有1000个元素,那么当您避免不必要的计算和避免},而{}避免不必要的计算。在
np.append(pairWiseDiff, diffTime)
时,您就可以获得系数1000的加速。runA
是您的代码,runB
避免{问题是,您是否真的需要
^{pr2}$N*N = reshape(N,N)
-数组pairWiseDiff
,因为您需要并从timestamps
获得的所有信息都是由以下内容提供的:这里我比较了3个代码:
^{3}$您可以将pairWiseDiff的计算数量减少到一半以下。时间戳有
N
个元素,pairWiseDiff有N*N
个元素。考虑pairWiseDiff:第一行是零,其他元素是对角对称的,不需要计算两次。所以从N*N
元素中,你只需要计算(N*N - N)/2
。在在我的解决方案中,pairWiseDiff仍然有
N*N
个元素。你可以用新的三对角数组来改进它。也许for循环可以用numpy.roll公司和/或数字切片. 在相关问题 更多 >
编程相关推荐