Python:两个2D阵列的交集

时间:2016-05-19 17:24:32

标签: python numpy

我在.csv文件中有一个名为'Max.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

即。从Max和Min中选择元素,以便只输出公共元素。

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

2 个答案:

答案 0 :(得分:2)

你提到:

  

我必须分别比较日期列上的Max和Min,   找到常用日期的索引,然后获取第二列   最大和最小。这看起来太复杂了......

事实上,这基本上是你需要做的事情,无论如何;但是使用numpy_indexed包(免责声明:我是它的作者),这丝毫不复杂:

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.in _'

替换'npi.indices'

答案 1 :(得分:1)

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'}