在另一个数组的条件下更改numpy数组

时间:2015-11-24 17:16:23

标签: python arrays performance numpy

我是python的新手,仍在努力寻找解决此问题的好方法:

我有一个2D数组label存储图像的标签(从0到10; 0是背景,1是树的等等)。从这个数组中,我想创建一个RGB图像rgb = np.zeros((height, width , 3), np.uint8)rgb中的每个像素的颜色取决于label的值。例如,rgb[4, 8] = green_color if label[4, 8] = 1。最有效的方法是什么?

3 个答案:

答案 0 :(得分:2)

假设您有一个名为colors的数组11 x 3的数组,其中包含11标签的所有可能颜色(标签范围从010) ,这是使用integer indexing -

的一种方法
img = colors[label.ravel()].reshape(label.shape+(3,)).astype('uint8')

运行示例以验证输出 -

In [58]: label
Out[58]: 
array([[ 2,  4,  0],
       [ 2,  9, 10],
       [ 6, 10, 10],
       [ 4,  0,  4],
       [ 1,  4, 10],
       [ 8,  1,  7],
       [ 9,  8,  0]])

In [59]: colors
Out[59]: 
array([[ 28, 175,  15],
       [  0, 255,   0], # Green color at label = 1
       [228,  12, 104],
       [198, 135,  99],
       [126, 124, 222],
       [ 35,  78,  14],
       [ 64,  61,   0],
       [ 34,  49, 147],
       [240,   1, 174],
       [252,   1, 181],
       [171, 114, 191]])

In [60]: img = colors[label.ravel()].reshape(label.shape+(3,))

In [61]: label[4,0]
Out[61]: 1

In [62]: img[4,0]
Out[62]: array([  0, 255,   0])

In [63]: label[5,1]
Out[63]: 1

In [64]: img[5,1]
Out[64]: array([  0, 255,   0])

答案 1 :(得分:1)

以下作品,感谢boolean indexing

label = np.asarray(( (0,1,1,1), (2,2,0,1) ))
# label will be:
# array([[0, 1, 1, 1],
#        [2, 2, 0, 1]])

# or (0, 255, 0) or so
green_color = np.asarray((0,1,0))

# initialize empty image
img = np.zeros((2,4,3))

# set pixels where label==1 to green
img[label == 1] = green_color

答案 2 :(得分:1)

您也可以使用np.choose

$.ajax({
    type: "POST",
    url: url,
    data: blahblahblah,
    success: function(data) {
        var printWindow = window.open( "data:application/pdf;base64, " + data );
        printWindow.print();
    }
});

另一个(更快!)选项是np.take,例如:

gen = np.random.RandomState(0)
labels = gen.randint(3, size=(5, 6))  # random labels between 0 and 2

print(repr(labels))
# array([[0, 1, 0, 1, 1, 2],
#        [0, 2, 0, 0, 0, 2],
#        [1, 2, 2, 0, 1, 1],
#        [1, 1, 0, 1, 0, 0],
#        [1, 2, 0, 2, 0, 1]])

colors = np.array([[255, 0, 0],     # red
                   [0, 255, 0],     # green
                   [0, 0, 255]])    # blue

rgb = labels[..., None].choose(colors)

# labels[0, 1] == 1, so rgb[0, 1] should be [0, 255, 0] (i.e. green)

print(repr(rgb[0, 1]))
# array([  0, 255,   0])

使用rgb = colors.take(labels, axis=0) 作为index array,可以更简洁地完成(但不会那么快):

labels

一些基准测试:

rgb = colors[labels]