python - 进行价值选择的最快方法?
问题描述
我有一个二维列表理解,它设置为 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,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]
解决方案
您可以修改处理方式以在 numpy 中快速完成所有操作,然后拆分最终结果(如果您确实需要)。您的数据基本上没有二维:一切都是按元素完成的。
让我们先看看如何生成输入数据。您可以将所有数据生成为数组而不是列表:
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])
推荐阅读
- apache-flink - Flink to Nifi the Magic Header 不存在
- matlab - 来自 Peter Corke 的 MATLAB 机器人工具箱的 SE2 失败
- javascript - 在 HTML 页面中显示 Ajax 响应
- google-app-engine - Google App Engine 自定义构建(第 2 代)
- c# - 如果匹配发生在子字符串中,如何在文本中查找模式匹配并出现异常?
- json - Updating TSQL Column From a JSON_VALUE in Another Table?
- pyspark - TypeError:参数无效,不是字符串或列
- here-api - 让 process.env 使用 HERE API 密钥
- php - 如何正确扩展 Laravel 5.7 路由器?
- php - 使数据库可搜索的正确方法是什么?