python-3.x - 有没有比 np.where() 更快的替代方案?
问题描述
我有一组 100 个数据文件,其中包含有关粒子的信息(ID、速度、位置等)。我需要从每个粒子中挑选出 10000 个具有特定 ID 号的特定粒子。我这样做的方式如下
for i in range(n_files+1):
data= load_data_file(i, datatype="double_precision")
for j in chosen_id_arr:
my_index= np.where((particleID_in_data)==j)
identity.append(ID[my_index])
x.append(x_component[my_index])
y.append(y_component[my_index])
z.append(z_component[my_index])
列表“chosen_id_array”包含所有此类 ID。数据文件是根据列表索引构建的。
由于某种原因,此代码段运行速度非常慢,我一直在为此寻找更快更有效的替代方案。非常感谢您提前。:)
解决方案
使用字典,您可以存储归因于粒子 ID 的位置信息,对字典使用 O(1) 查找缩放:
# What the data in a single file would look like:
data = {1:[0.5,0.1,1.], 4:[0.4,-0.2,0.1], ...}
# A lookup becomes very simple syntactically:
for ID in chosen_id_arr:
x, y, z = data[ID]
# Here you can process the obtained x,y,z.
这比 numpy 查找要快得多。关于循环内位置数据的处理,您可以考虑为不同的粒子 ID 设置单独的位置列表,但我认为这不在问题的范围内。pandas 包也可以在那里提供帮助。
推荐阅读
- java - 具有不同返回的 Panache Query
而不是 ArrayList - swift - 缺少 LinuxMain.swift 文件
- rest - 无效值:Flutter 中只有有效值为 0:1
- javascript - 添加元素时向正文添加垂直滚动以占用剩余空间
- amazon-web-services - 我的 AS3 存储桶策略仅适用于某些对象
- ios - 在没有配套应用程序的情况下从 Apple Watch 打开 Iphone 上的浏览器
- azure-devops-self-hosted-agent - Azure DevOps 服务 - 自托管代理已脱机
- active-directory - 活动目录。检索成员 distinctName 时发生以下异常:发生操作错误
- ethereum - Secp256k1 solidity 合约组装错误:SyntaxError: loop flag outdated。请考虑改用“switch”、“if”或“for”语句
- firebase - 错误:运行 firebase login 命令时发生意外错误