【问题标题】:How to clip an array to the minimum and maximum without using loops如何在不使用循环的情况下将数组剪辑到最小值和最大值
【发布时间】:2021-10-25 10:44:11
【问题描述】:

我还在学习python,我正在编写一个代码来将数组裁剪为最小值和最大值,但没有使用任何循环。

import numpy as np
import matplotlib.pyplot as plt

def clip(array, minimum, maximum):
    return None

array = [1,2,3,4,5,6,7,8]

minimum = input ("Enter your minimum value")
maximum = input ("Enter your maximum value")

# min = minimum
# max = maximum

# mean = (min + max)/2

result_arr = clip(array, minimum, maximum)
print (result_arr)
plt.plot(array, result_arr)
plt.show()

但我仍然没有显示结果图。我需要解决什么问题?

【问题讨论】:

  • 您的剪辑函数返回None,因此预计没有任何效果。你说的裁剪是什么意思,你想标准化到最小值/最大值?
  • 例如:如果我的数组是 [1 2 3 4 5 6 7 8] 裁剪到最小 3 并且最大 6 应该给出 [3 3 3 4 5 6 6 6]跨度>
  • 您可以使用numpy 但理论上它也使用循环。您可以使用map。我不确定map 是否使用循环。但很可能它会使用。
  • @Sherwet 好的,然后使用np.clip,不要重新发明轮子;)
  • 我这样做了,但是最小值和最大值可能会改变,但是每当我启动它们时,当我有两个变量时,就会显示错误“缺少 2 个必需的位置参数:'a_min' 和 'a_max'”最小值和最大值

标签: python numpy matplotlib


【解决方案1】:

根据你的“剪辑”应该做什么,这里有一些关于“本机 python”的想法,即没有导入(可以使用例如 numpypandas.Series 来完成):

#Remove all elements outside [mi,ma]
a = [1,2,3,4,5,6,7,8,9,10]
mi = 3 #min
ma = 7  #max
list(filter(lambda x: mi<x<ma,a)) # [4,5,6]
#Set elements greater than 7 to 7 and all elements less than 3 to three
def clip_to_min_max(x,mi,max):
   if x<mi: #Number is less than "mi" set it to "mi"
      return mi
   if x>ma: #Number is greater han "max", set it to "ma"
      return mx
   return x #It is between "mi" and "ma" - do nothing

[clip_to_min_max(x,3,7) for x in  a] #[3,3,3,4,5,6,7,7,7,7]

【讨论】:

    【解决方案2】:

    您可以按照 mozway 的建议简单地使用 np.clip


    clip 函数

    首先,我们导入所需的库。

    import numpy as np
    import matplotlib.pyplot as plt
    

    然后,只需定义clip 函数,该函数从用户输入中获取最小值和最大值。

    def clip(array):
        min_val, max_val = [
            float(input(i))
            for i in ["Minimum value: ", "Maximum value: "]
        ]
    
        return np.clip(array, min_val, max_val)
    

    输出

    我们将在一个示例数组上测试我们的 clip 函数。

    >>> a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
    >>> clip(a)
    
    Minimum value: 3
    Maximum value: 8
    
    array([3, 3, 3, 4, 5, 6, 7, 8, 8, 8])
    

    绘图

    我们将使用np.random.randint 定义一个任意数组。

    a = np.random.randint(0, 100, 100)
    x_values = np.arange(len(a))
    

    最后,我们剪裁和绘制两个数组,如下所示。

    fig, (ax1, ax2) = plt.subplots(1, 2, sharey=True, figsize=(9, 3),
                                   tight_layout=True, dpi=144)
    
    ax1.plot(x, a)
    ax1.set_title("Unclipped Array")
    
    ax2.plot(x, clip(a))
    ax2.set_title("Clipped Array")
    
    plt.show()
    
    Minimum value: 25
    Maximum value: 75
    

    上图是我们的最终结果。

    【讨论】:

      猜你喜欢
      • 2013-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-14
      相关资源
      最近更新 更多