Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 计算两个表中等价行的加权交集_Python_Algorithm_List_Matching - Fatal编程技术网

Python 计算两个表中等价行的加权交集

Python 计算两个表中等价行的加权交集,python,algorithm,list,matching,Python,Algorithm,List,Matching,以下问题是对此处发布的问题的概括: 我有两个文件。例如,第一个文件有100行和2列。第二个文件有1000行和3列 适合文件1适合文件2 A B C D E 1 2 1 2 0.1 1 3 1 2 0.3 2 4 1 2 0.9 我需要取第一个文件的第一行,即1和2,并检查第二个文件中有多少行的

以下问题是对此处发布的问题的概括:

我有两个文件。例如,第一个文件有100行和2列。第二个文件有1000行和3列

适合文件1适合文件2

A        B        C        D     E 

1        2        1        2    0.1
1        3        1        2    0.3 
2        4        1        2    0.9 
我需要取第一个文件的第一行,即1和2,并检查第二个文件中有多少行的C=1和D=2相对于e列中的相应值对每对(C,D)进行加权

在这个例子中,我在第二个文件中有3行C=1和D=2。它们的权重分别为E=0.1、0.3和0.9。对于E中的值进行加权,我需要将值0.1+0.3+0.9=1.3与第一个文件的对(A,B)=(1,2)相关联。然后,我需要对第二行(第一个文件)执行相同的操作,即1和3,并找出第二个文件中有多少行有1和3,再次对e列中的值进行加权,依此类推

第一个文件没有重复项(所有行都有不同的对,没有一个是相同的,只有文件2有许多相同的对,我需要查找)

最后,我需要第二个文件中与第一个FITS文件中的行具有类似值的行的加权数

结果应该是:

ab编号
1.2 1.3#1和2出现1.3次
1 3 4.5#1和3出现4.5次

对于A列和B列中的所有对,依此类推

我从上面引用的帖子中知道,E列中权重均等于1的解决方案涉及
计数器
,如下所示:

from collections import Counter
# Create frequency table of (C,D) column pairs
file2freq = Counter(zip(C,D))
# Look up frequency value for each row of file 1
for a,b in zip(A,B):
    # and print out the row and frequency data.
    print a,b,file2freq[a,b]
要回答这个问题,我需要在使用
计数器时将权重包含在E中:

file2freq = Counter(zip(C,D))
我想知道是否有可能做到这一点


非常感谢你的帮助

我将跟进伊瓜纳诺在对该问题的评论中提出的建议。我相信
numpy
是实现这一点的理想工具

import numpy as np

fits1 = np.genfromtxt('fits1.csv')
fits2 = np.genfromtxt('fits2.csv')

summed = np.zeros(fits1.shape[0])
for ind, row in enumerate(fits1):
    condition = (fits2[:,:2] == row).all(axis=1)
    summed[ind] = fits2[condition,-1].sum()  # change the assignment operator to += if the rows in fits1 are not unique
导入后,前两行将从文件中加载数据。这将返回一个浮点数组,并附带警告:将一个浮点与另一个浮点进行比较容易出现错误。在本例中,它将起作用,因为
fits1.csv
中的两列和
fits2.csv
中的前两列都是整数,并且由
genfromtxt
以相同的方式解析

然后,在for循环中创建变量
condition
,该变量表示只要
fits2
中的前两列与
fits1
的当前
中的列相匹配,就要将其考虑在内(结果是一个布尔数组)。 然后,最后,对于当前行索引
ind
,将数组
summated
的值设置为
fits2
第3列中所有值的总和,其中
条件为
True

我举了一个小例子,我得到了:

oliver@armstrong:/tmp/sto$ cat fits1.csv
1   2
1   3
2   4
oliver@armstrong:/tmp/sto$ cat fits2.csv
1   2   .1
1   2   .3
1   2   .9
2   4   .3
1   5   .5
2   4   .7
# run the above code:
# summed is:
# array([ 1.3,  0. ,  1. ])