在python中使用条件控制变量过滤数组以创建numpy矩阵

时间:2014-02-20 20:47:46

标签: python arrays numpy filter functional-programming

import numpy as np
    def get_positions(values, mintreshold=0.1):
        maxindex = 0
        result_row = np.zeros(np.shape((0, 0)), dtype=int)
        result = np.matrix(result_row)
        result_index = 0
        for index in xrange(len(values)):
            diff = values[maxindex] - values[index]
            if diff < 0:
                maxindex = index
            elif diff >= mintreshold:
                result[result_index, 1] = index
                result = np.vstack((result, result_row))
                result_index += 1
        return result

我有一个你看到的功能,给我给定列表的位置。只需过滤它。 所以我知道numpy.matrix不应该这样调用,这不能成为创建numpy.matrix的正确方法。但是对于那些条件控制变量,例如minindexmaxindex,我无法使用maplambdafilter

通过填充控制变量以功能方式创建numpy.matrix的正确方法是什么?

编辑: 我只想使用像positions = map(get_positions, values)

这样的东西

1 个答案:

答案 0 :(得分:2)

我不确定这是否正是您要查找的内容,但此处reduce的{​​{1}}可用于累积取决于输入列表“过去”值的状态。计算出与每个输入对应的状态列表后,可以使用functools删除不需要的条目,最后使用filter提取所需的信息。

另请注意使用map将索引注入列表。

enumarate

运行时,from functools import reduce def calc_diff(state, val): max=state[-1]['max'] diff=max-val if (diff<0): max=val state.append({'max': max, 'diff': diff}) return state in_list=[1,2,1,2,3,1] states=reduce(calc_diff, in_list, [{'max': 0}])[1:] result=list(map(lambda s: [0, s[0]], filter(lambda s: s[1]['diff']>0.1, enumerate(states)))) 将保留

states

结果将是[{'diff': -1, 'max': 1}, {'diff': -1, 'max': 2}, {'diff': 1, 'max': 2}, {'diff': 0, 'max': 2}, {'diff': -1, 'max': 3}, {'diff': 2, 'max': 3}] 。如果您愿意,可以在评论中添加[[0, 2], [0, 5]]以匹配您想要的输出。

还要特别注意[0, 0]调用结束时[1:]删除我注入的初始状态。

作为最后一点,您可以在calc_diff中添加阈值的过滤条件,并稍后避免过滤步骤,但我发现这种方法更灵活。