问题描述
我有一个2d列表理解功能,它根据第一个出现的条件设置为1或0。
由于它相对较慢,所以我想知道是否存在NumPy函数或库来将其加速到更有效的方式。
注意:子数组在相同索引处的长度相等。
result = [
[1 if (ratUp >ratDown) else 0 if (ratDown>ratUp) else 0 if (pointsDown>pointsUp) else 1
for ratUp,ratDown,pointsUp,pointsDown
in zip(ratiosUpSlice,ratiosDownSlice,upPointsSlice,downPointsSlice)]
for ratiosUpSlice,downPointsSlice
in zip(RatiosUp,RatiosDown,UpPointsSlices,DownPointsSlices)]
可复制:
import numpy as np
LEN = 10000
temp = np.random.randint(1,high=100,size=LEN)
RatiosUp = [np.random.uniform(size=rand) for rand in temp]
RatiosDown = [np.random.uniform(size=rand) for rand in temp]
UpPointsSlices = [np.random.uniform(size=rand) for rand in temp]
DownPointsSlices = [np.random.uniform(size=rand) for rand in temp]
解决方法
您可以修改处理方式,以便在numpy中快速执行所有操作,然后拆分最终结果(如果确实需要)。数据基本上没有2D的东西:每个元素都是按元素完成的。
让我们看看如何首先生成输入数据。您可以将所有数据生成为数组而不是列表:
import numpy as np
LEN = 10000
sizes = np.random.randint(1,100,size=LEN)
n = sizes.sum()
ratios_up = np.random.uniform(size=n)
ratios_down = np.random.uniform(size=n)
up_point_slices = np.random.uniform(size=n)
down_point_slices = np.random.uniform(size=n)
现在应该很容易将循环可视化为单个numpy操作:
result = (ratios_up > ratios_down) | ((ratios_up == ratios_down) & (points_up >= points_down))
如果需要将结果分成数组:
result = np.split(result,np.cumsum(sizes[:-1]))
如果您致力于split
,则可以更加简洁地编写整个操作:
splits = np.cumsum(np.random.randint(1,size=LEN))
up = np.random.uniform(size=(splits[-1],2))
down = np.random.uniform(size=(splits[-1],2))
result = np.split((up > down).any(1),splits[:-1])