进行值选择的最快方法是什么?

2024-09-25 18:22:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个2d列表理解,它可以设置1或0,这取决于第一个occouring条件

由于它的速度相对较慢,我想知道是否有一个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,ratiosDownSlice,upPointsSlice,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]

Tags: inforsizeifnprandomuniformzip
1条回答
网友
1楼 · 发布于 2024-09-25 18:22:44

您可以修改处理方式,以便在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, 100, 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])

相关问题 更多 >