首页 > 解决方案 > Numpy图像数组根据二进制类别设置像素维度值

问题描述

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

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

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

到目前为止,我所知道的切片/索引使我在这个问题上失败了,所以我知道我错过了一些可能非常直截了当的东西。我所尝试的甚至都没有让我接近。

标签: pythonarraysnumpy

解决方案


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

>>> 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) 克罗内克积

>>> 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)]

推荐阅读