Python:两个2D数组的交集

Python:两个2D数组的交集,python,numpy,Python,Numpy,我在名为“Max.csv”的.csv文件中有数据: Valid Date MAX 1/1/1995 51 1/2/1995 45 1/3/1995 48 1/4/1995 45 另一个名为“Min.csv”的csv如下所示: Valid Date MIN 1/2/1995 33 1/4/1995 31 1/5/1995 30 1/6/1995 39 我想要两个生成两个字典或任何其他建议的数据结构,以便在python中分别有两个单独的变量Ma

我在名为“Max.csv”的
.csv
文件中有数据:

Valid Date  MAX
1/1/1995    51
1/2/1995    45
1/3/1995    48
1/4/1995    45
另一个名为“Min.csv”的csv如下所示:

Valid Date  MIN
1/2/1995    33
1/4/1995    31
1/5/1995    30
1/6/1995    39
我想要两个生成两个字典或任何其他建议的数据结构,以便在python中分别有两个单独的变量Max和Min,如下所示:

Valid Date  MAX
1/2/1995    45
1/4/1995    45

Valid Date  MIN
1/2/1995    33
1/4/1995    31
i、 e.从最大值和最小值中选择元素,以便仅输出公共元素

我正在考虑使用numpy.intersect1d,但这意味着我必须首先在日期列上分别比较Max和Min,找到常用日期的索引,然后抓取Max和Min的第二列。这看起来太复杂了,我觉得有更聪明的方法使两条曲线Max和Min相交。

set()
内置必须足够,如下所示:

>>> max = {"1/1/1995":"51", "1/2/1995":"45", "1/3/1995":"48", "1/4/1995":"45"}
>>> min = {"1/2/1995":"33", "1/4/1995":"31", "1/5/1995":"30", "1/6/1995":"39"}

>>> a = set(max)
>>> b = set(min)
>>> {x:max[x] for x in a.intersection(b)}
{'1/4/1995': '45', '1/2/1995': '45'}
>>> {x:min[x] for x in a.intersection(b)}
{'1/2/1995': '33', '1/4/1995': '31'}
你提到:

我必须分别比较日期列的最大值和最小值, 找到常用日期的索引,然后抓取第二列以供参考 最大值和最小值。这看起来太复杂了

事实上,不管怎样,这都是你需要做的事情;但是使用这个软件包(免责声明:我是它的作者),这一点也不复杂:

import numpy_indexed as npi
common_dates = npi.intersection(min_dates, max_dates)
print(max_values[npi.indices(max_dates, common_dates)])
print(min_values[npi.indices(min_dates, common_dates)])
请注意,此解决方案是完全矢量化的(不包含python级别的循环),因此必然比当前接受的答案快得多


注2:这是假设日期列是唯一的;如果没有,您应该将“npi.index”替换为“npi.in”

您能否提供有关如何从csv文件创建集合的提示?我使用pandas将csv文件读取到数据框中。这可能会对您有所帮助。请投票并检查我的答案是否正确,我给出了答案。Zanam您成功了吗?是的,我成功了,但我喜欢@Eelco的答案,因为它没有运行循环