[英]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.