【问题标题】:Numpy 2D spatial mask to be filled with specific values from a 2D array to form a 3D structureNumpy 2D 空间掩码用 2D 数组中的特定值填充以形成 3D 结构
【发布时间】:2018-05-20 09:28:36
【问题描述】:

总的来说,我对编程很陌生,但直到现在我才弄清楚这个问题。

我有一个二维 numpy 数组 mask,假设是 mask.shape is (3800,3500),其中填充了 0 和 1,代表 2D 图像的空间分辨率,其中 1 代表可见像素,0 代表背景。
我有data.shape is (909,x) 的第二个二维数组data,其中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,但由于两个二维数组的形状明显不同,因此广播失败。
有人有解决办法吗?我相信一定有一个简单的方法......

【问题讨论】:

  • 什么应该包含背景像素的第三维(0)?
  • 附加零。基本上我不关心0像素。他们可以在第三维中获得 909 个额外的零。

标签: python numpy multidimensional-array array-broadcasting


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-20
    • 2020-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多