python - 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
.
到目前为止,我所知道的切片/索引使我在这个问题上失败了,所以我知道我错过了一些可能非常直截了当的东西。我所尝试的甚至都没有让我接近。
解决方案
您可以简单地沿最后一个轴排序:
>>> 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)]
推荐阅读
- javascript - 在 Mozilla Firefox for Google Apps 脚本中显示 NS 绑定中止
- php - PHP 未加载 /etc/sysconfig/httpd 中设置的 ENV 变量
- c++ - GCC 和 Clang 之间的 lambda 与函数的完全相反的基准测试结果
- amazon-web-services - AWS SES - 我做得对吗?
- css - react material-ui 如何覆盖 muibox-root
- python - 不正确的整数值 mySQL
- javascript - 谷歌地图回调并不总是触发
- java - 子文件夹不显示文本文件 - JAVA
- lua - 使用 zerobrane 调试 openresty
- html - 将不在我计算机上的图像上传到 Cloudinary