将逻辑矩阵(false / true)映射到uint8矩阵(0/255)的更有效方法?

时间:2016-03-28 19:57:51

标签: python numpy type-conversion

我有一个2d的布尔值数组,我想将false映射到0(uint8),将true映射到255(uint8),这样我就可以将矩阵用作黑白图像。

目前我有:

uint8matrix = boolMatrix.astype(numpy.uint8)*255

但我认为乘法是增加了不必要的计算。

2 个答案:

答案 0 :(得分:1)

bool在numpy中隐式地转换为int;所以简单地用np.uint8(255)相乘就可以了,并为你节省额外的数据传递。

答案 1 :(得分:1)

用于调优,Cython或更简单的python用户Numba,可以给你明智的改进:

from numba import jit
@jit(nopython=True)
def cast(mat):
    mat2=empty_like(mat,uint8)
    for i in range(mat.shape[0]):
        for j in range(mat.shape[1]):
            if mat[i,j] : mat2[i,j]=255
            else : mat2[i,j]=0
    return mat2

对1000x1000随机矩阵的一些测试:

In [20]: %timeit boolMatrix*uint8(255)
100 loops, best of 3: 9.46 ms per loop

In [21]: %timeit cast(boolMatrix)
1000 loops, best of 3: 1.3 ms per loop