基于二进制分类设置像素维度值的Numpy图像数组

2024-05-13 03:42:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在做一个CNN的项目,使用脑部核磁共振数据。图像标签位于形状(20636, 240, 240, 3)的大numpy数组中。第三维将像素值保存为基于肿瘤组织标准的二进制数据,其中它可以是:

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

我需要创建一个新的标签数组来代替这些组织类别,我只需要一个数组来指定标签像素为肿瘤/非肿瘤,但保持原始形状。我想我可以通过掩蔽任何像素==1并设置data[:,:,:,0:1] = 1,然后设置data[:,:,:,1:3] = 0的所有值来实现这一点。你知道吗

到目前为止,我所知道的切片/索引是失败的,我与这个问题,所以我知道我错过了一些东西可能相当直接。我试过的都没能让我靠近。你知道吗


Tags: 数据项目图像numpydata标准二进制像素
1条回答
网友
1楼 · 发布于 2024-05-13 03:42:27

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

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

相关问题 更多 >