我正在使用脑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
的所有值来做到这一点。
到目前为止,我对切片/索引的了解使我无法解决这个问题,所以我知道我可能缺少一些简单明了的东西。我尝试过的一切甚至还没有使我接近。
答案 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)]