首页 > 解决方案 > numpy 中是否有“反向剪辑”功能?

问题描述

我有工作代码,但想知道是否有它的numpy实现。这更多是为了满足我的好奇心以及优化和使代码更漂亮;我没有严重的问题。不过,我想这种情况很常见,以至于除了我自己之外,其他人都会很感兴趣。

所以,情况:我在一个循环中多次计算一个值,并且只想保存最小值和最大值。

最初,我使用

import numpy as np
vals = []
for obj in objects:
    #...do stuff...
    vals.append(obj.calc_value())
    #...do more stuff
minmax = [np.min(vals), np.max(vals)]

哪个有效,又好又短。但是,因为我存储了所有值,但只需要最小值和最大值,这似乎浪费了非常好的内存空间。因此我将其更改为

import numpy as np
minmax = [np.inf, -np.inf]
for obj in objects:
    #...do stuff...
    val = obj.calc_value()
    if val < minmax[0]:
        minmax[0] = val
    if val > minmax[1]:
        minmax[1] = val
    #...do more stuff

这也有效,但有点冗长。当然,我可以将代码中的四行提取到我猜的函数中,但是......

我不禁想知道,如果没有这个numpy功能。类似于“反向”clip功能。一个函数,类似于clip,将值与区间进行比较。但是它不会返回(可能更改的)值,因此它位于提供的间隔(这是什么clip),而是返回所需的(可能扩展的)间隔,以便提供的值位于其中。

import numpy as np
minmax = [np.inf, -np.inf]
for obj in objects:
    #...do stuff...
    minmax = np.reverse_clip(minmax, obj.calc_value())
    #...do more stuff

如果有,我很想听听。另外,有什么想法我怎么能在不问这里的情况下找到它?我查看了numpy的数组方法,但在那里找不到。

标签: pythonnumpy

解决方案


您可以反转第一项上的符号并将其应用于max两者,然后在循环后将其更改回来:

for obj in objects:
    i = obj.calc_value()
    minmax= map(max, zip([-i, i], minmax)) # using python
    minmax = np.vstack((minmax, [-i, i])).max(0) #using numpy
minmax *= np.array([-1, 1]) #using numpy
minmax = [i * j for i, j in zip(a1, [-1, 1])] # using python, or do list(a1) * np.array([-1, 1])

推荐阅读