numpy图像数组基于二进制类别设置像素尺寸值

时间:2018-10-23 20:28:37

标签: python arrays numpy

我正在使用脑MRI数据进行CNN项目。图像标签以形状为(20636, 240, 240, 3)的大型numpy数组组成。第3维根据肿瘤组织标准将像素值保存为二进制数据,可以是以下之一:

     [0,0,0]
     [0,0,1]
     [0,1,0]
     [1,0,0]

我需要创建一个新的标签数组,而不是这些组织类别,我只需要一个数组即可将标签像素指定为肿瘤/不是肿瘤,但要保持原始形状。我以为可以通过掩盖任何像素== 1并设置data[:,:,:,0:1] = 1,然后设置data[:,:,:,1:3] = 0的所有值来做到这一点。

到目前为止,我对切片/索引的了解使我无法解决这个问题,所以我知道我可能缺少一些简单明了的东西。我尝试过的一切甚至还没有使我接近。

1 个答案:

答案 0 :(得分:0)

您可以简单地沿最后一个轴排序:

>>> import numpy as np
>>>     
# create example                                                                                                            
>>> a = np.identity(4, int)[np.random.randint(0, 4, (2, 2, 2)), :-1]                            
>>> a                                                                                                               
array([[[[1, 0, 0],                                                                                                 
         [0, 0, 1]],                                                                                                

        [[0, 0, 1],                                                                                                 
         [0, 0, 0]]],                                                                                               


       [[[0, 0, 1],                                                                                                 
         [1, 0, 0]],                                                                                                

        [[0, 0, 0],                                                                                                 
         [0, 0, 1]]]])                                                                                              
>>>                                                                                                                 
>>> b = a.copy()
# flip last axis to obtain descending order
>>> b[..., ::-1].sort(axis=-1)
>>> b                                                                                                               
array([[[[1, 0, 0],
         [1, 0, 0]],

        [[1, 0, 0],
         [0, 0, 0]]],


       [[[1, 0, 0],
         [1, 0, 0]],

        [[0, 0, 0],
         [1, 0, 0]]]])

其他方法:

1)预分配

>>> b = np.zeros_like(a)
>>> b[..., 0] = a.any(axis=-1)

2)Kronecker产品

>>> np.kron(a.any(axis=-1, keepdims=True), (1,0,0))

3)外部产品

>>> np.multiply.outer(a.any(axis=-1), (1,0,0))

4)花式索引

>>> np.outer((0,1), (1,0,0))[a.any(axis=-1).view(np.uint8)]