Numpy:对numpy.split生成的子数组的高效访问

时间:2015-08-26 10:55:31

标签: python arrays numpy arraylist

我有以下代码,它根据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来识别权重和数字。

也许有人可以动态完成整个操作

非常感谢您的帮助。

最佳, 基督教

1 个答案:

答案 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