【问题标题】:python subtract every even column from previous odd columnpython从前一个奇数列中减去每一个偶数列
【发布时间】:2016-12-31 19:48:24
【问题描述】:

抱歉,之前有人问过这个问题——我找不到这个具体问题。

在python中,我想从前一个奇数列中减去每个偶数列:

所以从:

292.087 190.238 299.837 189.488 255.525 187.012
300.837 190.887 299.4   188.488 248.637 187.363
292.212 191.6   299.038 188.988 249.65  187.5
300.15  192.4   307.812 189.125 247.825 188.113

101.849 110.349 68.513
109.95  110.912 61.274
100.612 110.05  62.15
107.75  118.687 59.712

会有未知数量的列。我应该在pandasnumpy 中使用一些东西吗?

提前致谢。

【问题讨论】:

  • 这个数据是如何表示的?你在使用 NumPy 吗?熊猫?列表列表?
  • 那不是python数据结构。这是 CSV 文件吗?
  • 是的,这将从 CSV 文件导入 python。
  • @BioProg,这是tab-delimited 文件吗?

标签: python matrix subtraction


【解决方案1】:

您可以使用 pandas 完成此操作。您可以分别选择偶数和奇数索引列,然后将它们相减。

@hiro 主角,我不知道你能做到 StringIO 魔术。太辣了。

import pandas as pd
import io

data = io.StringIO('''ROI121  ROI122  ROI124  ROI125  ROI126  ROI127
                      292.087 190.238 299.837 189.488 255.525 187.012
                      300.837 190.887 299.4   188.488 248.637 187.363
                      292.212 191.6   299.038 188.988 249.65  187.5
                      300.15  192.4   307.812 189.125 247.825 188.113''')

df = pd.read_csv(data, sep='\s+')

请注意,偶数/奇数项可能违反直觉,因为 python 是 0 索引的,这意味着信号列实际上是偶数索引,而背景列是奇数索引。如果我正确理解您的问题,这与您使用偶数/奇数术语相反。只是指出区别以避免混淆。

# strip the columns into their appropriate signal or background groups
bg_df = df.iloc[:, [i for i in range(len(df.columns)) if i%2 == 1]]
signal_df = df.iloc[:, [i for i in range(len(df.columns)) if i%2 == 0]]

# subtract the values of the data frames and store the results in a new data frame
result_df = pd.DataFrame(signal_df.values - bg_df.values)

result_df 包含的列是信号列和背景列之间的差异。不过,您可能想要重命名这些列名。

>>> result_df
         0        1       2
0  101.849  110.349  68.513
1  109.950  110.912  61.274
2  100.612  110.050  62.150
3  107.750  118.687  59.712

【讨论】:

  • 是的,我发现伪造这样的文件对 SO 答案很有用。喜欢你的熊猫版! +1
【解决方案2】:
import io

# faking the data file
data = io.StringIO('''ROI121  ROI122  ROI124  ROI125  ROI126  ROI127
292.087 190.238 299.837 189.488 255.525 187.012
300.837 190.887 299.4   188.488 248.637 187.363
292.212 191.6   299.038 188.988 249.65  187.5
300.15  192.4   307.812 189.125 247.825 188.113''')

header = next(data)  # read the first line from data
# print(header[:-1])
for line in data:
    # print(line)
    floats = [float(val) for val in line.split()]  # create a list of floats
    for prev, cur in zip(floats[::2], floats[1::2]):
        print('{:6.3f}'.format(prev-cur), end=' ')
    print()

带输出:

101.849 110.349 68.513 
109.950 110.912 61.274 
100.612 110.050 62.150 
107.750 118.687 59.712 

如果您知道data[start:stop:step] 的含义以及zip 的工作原理,这应该很容易理解。

【讨论】:

    猜你喜欢
    • 2011-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-23
    • 2012-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多