【问题标题】:filtering array with conditional control variables in python to create numpy matrix在python中使用条件控制变量过滤数组以创建numpy矩阵
【发布时间】:2014-03-22 01:40:45
【问题描述】:
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)

【问题讨论】:

  • 我敢打赌,np.wherenp.argmax/values.max() 有一种简单的方法可以做你想做的事。也许像np.where(values-values.max() &gt;= max_threshold)
  • 你能展示一个示例输入并期望输出吗?
  • 我删除了 minindex 值来清除。使用这种方法,我想获得最高点与最新最低点的差矩阵。例如。 print get_positions([1,2,1,2,3,1]) 打印 [[0 2][0 5][0 0]]
  • 看起来很简单,就像a=[1,2,1,2,3,1]; np.where(a[1:]-a[:-1]&lt;0)[0] + 1 做同样的事情。

标签: python arrays numpy filter functional-programming


【解决方案1】:

我不确定这是否正是您要查找的内容,但可以在这里使用来自functoolsreduce 来累积取决于输入列表的“过去”值的状态。一旦计算出与每个输入对应的状态列表,您就可以使用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] 以匹配 cmets 中所需的输出。

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

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

【讨论】:

  • 我还想到,您可以将状态从 [(max1, diff1), ...] 更改为 (lastMax, [diff1, diff2, ...]) 并避免保留整个列表的最大值历史记录。
猜你喜欢
  • 2014-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-24
  • 1970-01-01
  • 2022-11-02
  • 1970-01-01
  • 2016-01-16
相关资源
最近更新 更多