将所有数组元素转换为Python中的范围

时间:2013-09-15 22:51:23

标签: python arrays numpy

我有一个如下所示的数组:

im = plt.array(Image.open('Mean.png').convert('L'))

我必须将其所有值转换为指定范围。为此,我有这个功能:

def translate(value, inputMin, inputMax, outputMin, outputMax):
    # Figure out how 'wide' each range is
    leftSpan = inputMax - inputMin
    rightSpan = outputMax - outputMin

    # Convert the left range into a 0-1 range (float)
    valueScaled = float(value - inputMin) / float(leftSpan)

    # Convert the 0-1 range into a value in the right range.
    return outputMin + (valueScaled * rightSpan)

在我的具体问题中,我必须显示这个图像轮廓:

plt.figure()
CS = plt.contour(im, origin='image', extent=[-1, 1, -1, 1])
plt.colorbar(CS, shrink=0.5, aspect=10)
plt.clabel(CS, inline=1, fontsize=10)
plt.savefig("ContourLevel2D.png")

但每个灰度值必须转换为-1..1范围。 我知道我可以这样做:

CS = plt.contour(im/100, origin='image', extent=[-1, 1, -1, 1])

im 的每个元素除以 100 。 但是有没有类似/简单的方法来使用我上面提到的函数来转换这些值?

提前致谢。

2 个答案:

答案 0 :(得分:1)

translate函数内的所有操作都可以直接应用于您的数组:

import numpy as np
from matplotlib import pyplot as plt
from PIL import Image

im = np.array(Image.open('Mean.png').convert('L'), dtype=float)

# Figure out how 'wide' each range is
leftSpan = inputMax - inputMin
rightSpan = outputMax - outputMin

# Convert the left range into a 0-1 range (float)
imNormalized = (im - inputMin) / leftSpan

# Convert the 0-1 range into a value in the right range.
imTranslated = outputMin + (imScaled * rightSpan)

你已经完成了,im现在已经有了“跨度”。

通过重新规范化就可以略微减少,也就是说,不要创建单独的数组,只需修改当前的数组。每次重命名数组时,都会复制一份。

im = np.array(Image.open('Mean.png').convert('L'), dtype=float)

# normalize the input, in place 
im -= inputMin
im /= inputMax

# Convert the 0-1 range into a value in the right range.
im *= outputMax - outputMin
im += outputMin

答案 1 :(得分:0)

我猜这是pyplot,并且数组是numpy数组。

在这种情况下:

import numpy as np
vtranslate = np.vectorize(translate, excluded=['inputMin', 'inputMax', 'outputMin', 'outputMax'])
plt.contour(vtranslate(im, imin, imax, omin, omax), ...)

但这只是猜测,因为我正在阅读我通常不会使用的库的文档,而且你没有解释你实际使用的库......