python - 从非常大的输入数组中获取参考数组中对应值的数组
问题描述
我有以下数组:
table = np.array([
[1.0, 1.0, 3.0, 5.0],
[1.0, 2.0, 5.0, 3.0],
...
[2.0, 5.0, 2.0, 1.0],
[8.0, 9.0, 7.0, 2.0]])
让我们分别用 ['a', 'b', 'm', 'n'] 来命名不同的列。
“table”是我的参考表,我想提取 'm' 和 'n' 给定的 'a' 和 'b' 包含在我们称为 'my_list' 的列表中。在该列表中,我们允许重复对 (a, b)。
注意:这里的列表可以称为数组(不是python意义上的)
使用 for 循环更容易做到这一点。但是,对于我的问题,我的列表 'my_list' 可以包含超过 100000 对(a,b),因此使用 for 循环对我的工作来说并不是最佳选择。如何在几行(1 到 3 行)中使用 numpy 函数或 pandas 函数?
我想要的一个例子:给定以下列表
my_list = np.array([
[1.0, 2.0],
[1.0, 2.0],
[8.0, 9.0]])
我想得到以下结果:
results = np.array([
[5.0, 3.0],
[5.0, 3.0],
[7.0, 2.0]])
先感谢您
编辑 1:与 for 循环等效
这是 for 循环的等价物(使用 for 循环的最简单方法,没有二分搜索):
result = []
for x in my_list:
for y in table:
if (x[0] == y[0]) and (x[1] == y[1]):
result.append([y[2], y[3]])
break
print(results)
解决方案
使用pandas的一种可能方法是执行内部merge
pd.DataFrame(table).merge(pd.DataFrame(my_list))[[2, 3]].to_numpy()
array([[5., 3.],
[5., 3.],
[7., 2.]])
推荐阅读
- mongodb - MongoDB oplog 包含许多 Noop
- postgresql - postgres 10 对等身份验证失败
- c# - 在反序列化 JSON 文件时不使用完整路径
- matlab - 如何在 MATLAB 中实现人口普查变换
- f# - 如何在 \n 处反转字符串列表中的每个字符串?
- amazon-web-services - 启用 CDN 到 S3 存储桶而不授予 AWS 中的公共访问权限
- ruby-on-rails - 创建 ruby/bin/rails 文件的代码模式在哪里
- java - Spring JPA 中的 PostgreSQL 数组运算符
- android - 使用协程执行的 Android kotlin 任务
- jsf - p:autocomplete itemSelect和更改ajax事件不一致,没有widgetVar的解决方案