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,代表二维图像的空间分辨率,其中 1 代表可见像素,0代表背景。
我有第二个二维数组 data
of data.shape is (909,x)
其中 x
正好是第一个数组中 1 的数量。我现在想用第二个数组中长度为 909
的向量替换第一个数组中的每个 1 。最终得到 shape(3800,3500,909)
的 3D 数组,它基本上是一个 2D x x y 图像,其中 select 像素在 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
但广播失败,因为两个二维数组的形状明显不同。
有人有解决办法吗?我相信一定有一个简单的方法...
基本上,您只需使用 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()
总的来说,我对编程还很陌生,但直到现在我才弄明白这个问题。
我有一个二维 numpy 数组 mask
,让我们说 mask.shape is (3800,3500)
其中填充了 0 和 1,代表二维图像的空间分辨率,其中 1 代表可见像素,0代表背景。
我有第二个二维数组 data
of data.shape is (909,x)
其中 x
正好是第一个数组中 1 的数量。我现在想用第二个数组中长度为 909
的向量替换第一个数组中的每个 1 。最终得到 shape(3800,3500,909)
的 3D 数组,它基本上是一个 2D x x y 图像,其中 select 像素在 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
但广播失败,因为两个二维数组的形状明显不同。
有人有解决办法吗?我相信一定有一个简单的方法...
基本上,您只需使用 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()