我有以下代码,它根据split函数生成子数组列表。在这里,我只是比较每个元组的第一个值,并根据我生成子数组的差异。到目前为止一切都很好。
import numpy as np
f = np.genfromtxt("d_n_isogro_ms.txt", names=True, dtype=None, usecols=(1,-1))
dm = np.absolute(np.diff(f['mz']))
pos = np.where(dm > 2)[0] + 1
fsplit = np.array_split(f, pos)
这是示例输入的样子(仅限摘录):
[(270.0332, 472) (271.0376, 1936) (272.0443, 11188) (273.0495, 65874)
(274.0517, 8582) (275.0485, 4081) (276.0523, 659) (286.058, 1078)
(287.0624, 4927) (288.0696, 22481) (289.0757, 84001) (290.078, 13688)
(291.0746, 5402) (430.1533, 13995) (431.1577, 2992) (432.1685, 504)]
<type 'numpy.ndarray'>
然后将此特定数据的位置计算为:
pos = [7,12]
这是我的示例输出:
[array([(270.0332, 472), (271.0376, 1936), (272.0443, 11188),
(273.0495, 65874), (274.0517, 8582), (275.0485, 4081),
(276.0523, 659)], dtype=[('mz', '<f8'), ('I', '<i8')]),
array([(286.058, 1078), (287.0624, 4927), (288.0696, 22481),
(289.0757, 84001), (290.078, 13688), (291.0746, 5402)],
dtype=[('mz', '<f8'), ('I', '<i8')]),
array([(430.1533, 13995),
(431.1577, 2992), (432.1685, 504)],
dtype=[('mz', '<f8'), ('I', '<i8')])]
我想对每个阵列执行加权平均。有没有一种有效的方法来做这个与numpy?我基本上失败了索引。最好,我想使用dtype来识别权重和数字。
也许有人可以动态完成整个操作
非常感谢您的帮助。
最佳, 基督教
答案 0 :(得分:1)
np.array_split
的输出是包含不等长度数组的Python列表。在这种情况下,你可以做的最好的是Python循环:
result = [np.average(f_i['mz'], weights=f_i['I']) for f_i in fsplit]
但是有可能使用add.reduceat
代替array_split
来提出完全向量化的解决方案:
dm = np.abs(np.diff(f['mz']))
pos = np.flatnonzero(np.r_[True, dm > 2])
totals = np.add.reduceat(f['mz']*f['I'], pos)
counts = np.add.reduceat(f['I'], pos)
result = totals / counts