繁体   English   中英

Numpy 2D空间蒙版将填充2D数组中的特定值以形成3D结构

[英]Numpy 2D spatial mask to be filled with specific values from a 2D array to form a 3D structure

一般而言,我对编程还很陌生,但是直到现在我都无法弄清楚这个问题。

我有一个二维的numpy数组mask ,可以说mask.shape is (3800,3500) ,其中填充0和1代表2D图像的空间分辨率,其中1代表可见像素,0代表背景。
我有第二个二维数组data data.shape is (909,x)其中x恰好是第一个数组中1s的数量。 我现在想用第二个数组中长度为909的向量替换第一个数组中的每个1。 最终得到一个shape(3800,3500,909)的最终3D数组,该数组基本上是2x x y图像,其中选择像素在z方向上具有909个值的光谱。

我试过了

mask_vector = mask.flatten
ones = np.ones((909,1))
mask_909 = mask_vector.dot(ones) #results in a 13300000 by 909 2d array
count = 0
for i in mask_vector:
    if i == 1:
        mask_909[i,:] = data[:,count]
        count += 1

result = mask_909.reshape((3800,3500,909))

当执行plt.imshow(result.mean(axis=2))时,这将导致一个可行的3D数组提供2D图像,但该值仍然仅为1s和0s,而不是z方向上所需的光谱数据。 我也尝试使用np.where但是广播失败,因为两个2D数组的形状明显不同。
有没有人解决? 我相信一定有一个简单的方法...

基本上,您只需要使用np.where来定位mask数组中的1。 然后将result数组初始化为零,并使用np.where的输出将第三维替换为数据:

import numpy as np

m, n, k = 380, 350, 91
mask = np.round(np.random.rand(m, n))
x = np.sum(mask == 1)
data = np.random.rand(k, x)

result = np.zeros((m, n, k))
row, col = np.where(mask == 1)
result[row,col] = data.transpose()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM