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

时间:2018-05-20 09:28:36

标签: python numpy multidimensional-array numpy-broadcasting

我对编程很新,但直到现在我才能解决这个问题。

我有一个二维的numpy数组mask,让我们说mask.shape is (3800,3500)填充0和1表示2D图像的空间分辨率,其中1表示可见像素和0表示背景 我有data的第二个二维数组data.shape is (909,x),其中x正是第一个数组中1的数量。我现在想要用第二个数组中的长度为909的向量替换第一个数组中的每个1。产生shape(3800,3500,909)的最终3D数组,其基本上是2D x 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))

这导致可行的3D阵列在执行plt.imshow(result.mean(axis=2))时给出2D图像 但是这些值仍然只是1和0而不是z方向上所需的光谱数据。 我也尝试使用np.where,但广播失败,因为两个2D阵列的形状明显不同 有人有解决方案吗?我相信必须有一个简单的方法......

1 个答案:

答案 0 :(得分:0)

基本上,您只需使用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()