如何将数组值0和255转换为对应的0和1数组

时间:2017-08-07 18:05:44

标签: python numpy

我有一个图像表示为numpy数组,其值为0和255(范围内没有其他值)。将它转换为0和1数组的最佳方法是什么。

4 个答案:

答案 0 :(得分:3)

my_array = np.array([255,255,0,0])
my_array = my_array / 255

将输出

array([ 1., 1., 0., 0.])

换句话说,它不会对0-255范围内的所有值进行标准化(即使你说它是唯一的2个值,它也适用于介于两者之间的所有值,同时保持比率)

答案 1 :(得分:2)

听起来像是numpy.clip的工作:

>>> a = np.array([0, 255, 0, 255, 255, 0])
>>> a.clip(max=1)
array([0, 1, 0, 1, 1, 0])

来自文档:

  

给定间隔,区间外的值将被剪切到间隔边。例如,如果指定了[0,1]的间隔,则小于0的值将变为0,而大于1的值将变为1.

答案 2 :(得分:1)

您可以屏蔽(使用>0==255或其他任何内容),然后转换为int类型:

npa = np.array([0,255,0,255,255,255,0])
npa
array([  0, 255,   0, 255, 255, 255,   0])


(npa>0).astype('int')
array([0, 1, 0, 1, 1, 1, 0])

答案 3 :(得分:1)

因为有很多答案可以给出正确的答案,所以我只想测试不同的方法,并根据计算成本确定哪种方法最好。我写了下面的代码,创建一个给定的数据集,这是一个0和255值的图像,随机放置,然后我研究每个提出的算法的平均经过时间,改变图像的像素数(注意我使用均值来降低测量中的噪声):

import numpy as np
import time

times1_all = [] 
times2_all = []
times3_all = []


for i in xrange(20):
    times1 = []
    times2 = []
    times3 = []

    xsizes = np.arange(100,10000,500)
    print len(xsizes)
    for xsize in xsizes:
        #Create the dataset                                                                                                                                                                                                                                                     
        ysize = xsize
        xrand = np.random.randint(0,xsize, xsize)
        yrand = np.random.randint(0,ysize, xsize)
        a = np.zeros([xsize,ysize])
        a[xrand, yrand] = 255

        start = time.time()
        b = (a == 255).astype('int')
        stop = time.time()
        time1 = stop-start

        start = time.time()
        b = a/255
        stop = time.time()
        time2 = stop-start

        start = time.time()
        b = a.clip(max=1)
        stop = time.time()
        time3 = stop-start
        print time3

        times1.append(time1)
        times2.append(time2)
        times3.append(time3)
        print 'Elapsed times --> (1)/(1)=%.2f, (2)/(1)=%.2f, (3)/(1)=%.2f' %(time1/time1,time2/time1,time3/time1)

    times1_all.append(times1)
    times2_all.append(times2)
    times3_all.append(times3)

times1_mean = np.mean(times1_all, axis=0)
times2_mean = np.mean(times2_all, axis=0)
times3_mean = np.mean(times3_all, axis=0)

该测试的结果显示在下图中,其显示了作为图像像素数的函数的不同算法的经过时间(我仅引用x轴中像素的边数)。正如所料,图像越大,完成工作所需的时间越长。但是,很明显算法之间存在系统差异。对于任意数量的像素,@ randomir和@Ofer提出的算法的性能优于@ user1717828提出的算法。所以,根据这个指标,@ Ofer和$ randomir是等价的。

Comparison of algorithms