在python中用条件控制变量过滤数组生成numpy矩阵

2024-09-29 20:29:19 发布

您现在位置:Python中文网/ 问答频道 /正文

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不应该这样调用,这不可能是创建{}的正确方法。但是对于那些条件控制变量,比如minindexmaxindex,我不能使用maplambda,或{}。在

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

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


Tags: 方法函数numpymapgetindexnpdiff
1条回答
网友
1楼 · 发布于 2024-09-29 20:29:19

我不确定这是否正是您要查找的,但是reduce中的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将保持不变

^{pr2}$

结果是[[0, 2], [0, 5]]。如果您愿意,可以在注释中附加一个[0, 0],以匹配所需的输出。在

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

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

相关问题 更多 >

    热门问题