我对编程很新,但直到现在我才能解决这个问题。
我有一个二维的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阵列的形状明显不同
有人有解决方案吗?我相信必须有一个简单的方法......
答案 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()