python - 计算两个表中等效行的加权交集

标签 python algorithm list matching

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

Counting the intersection of equivalent rows in two tables

我有两个 FITS 文件。例如,第一个文件有 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列中的相应值

在示例中,我在第二个文件中有 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 文件的行具有相似值的行的加权数

结果应该是:

A B 数字 1 2 1.3 # 1 和 2 出现 1.3 次 1 3 4.5 # 1 和 3 出现 4.5 次

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

从上面引用的帖子得知,E列权重全等于1的解法涉及到Counter,如下:

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]

要回答这个问题,我需要在使用 Counter 时在 E 中包含权重:

file2freq = Counter(zip(C,D))

我想知道是否可以这样做。

非常感谢您的帮助!

最佳答案

我会跟进 Iguananaut 在对该问题的评论中提出的建议。我相信 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

导入后,前两行将从文件中加载数据。这将返回一组 float ,并带有警告:将一个 float 与另一个 float 进行比较容易出现错误。在这种情况下,它会起作用,因为 fits1.csv 中的列和 fits2.csv 中的前两列都是整数,并且由 以相同的方式解析>genfromtxt.

然后,在 for 循环中创建了变量 condition,它表示 fits2 中的前两列随时与当前 中的列相匹配fits1 的 row,它是要被考虑在内的(结果是一个 bool 数组)。 然后,最后,对于当前行索引 ind,将数组 summed 的值设置为 fits2 第 3 列中所有值的总和>,其中 conditionTrue

对于我制作的一个小例子,我得到了这个:

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. ])

关于python - 计算两个表中等效行的加权交集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28626989/

相关文章:

python - Python 可以识别 Excel 单元格中的公式吗?

python - PUT 方法在 django-tastypie 中不起作用?

python - 计算python中递归算法中的操作数

algorithm - 卷积网络中的最佳过滤器数量

java - 在列表中正确使用泛型

python - 使 matplotlib 图形部分不可见

python - 无法理解如何通过列表切片将字符串中的字符分配给列表在以下代码段中工作

algorithm - n片叶子怎么计算叶子的个数?

python - 如何从两个 "array.flatten()"-ed列表在python中创建字符串列表

python - 在 python 中使用名称列表打开多个文件