【问题标题】:Get 2D array after mask condition蒙版条件后获取二维数组
【发布时间】:2016-04-11 10:27:18
【问题描述】:

我对我的脚本有疑问,希望得到您的帮助或任何想法来解决我的问题。

我有一个包含数据的二维数组,我想将它除以另一个二维数组。到目前为止,这不是问题。 但我提出了一个条件:这两个数组都必须考虑二进制掩码并且只取像素 = 1。

我写的是:

fig10, (ax1, ax2, ax3) = plt.subplots(1,3)

fig = plt.gcf()
fig.set_size_inches(16, 9)

# ARRAYS TAKE ACCOUNT PIXEL = 1 IN THE BINARY GRID
convolution_mask_locale_data = convolution_mask_locale[grid.T == 1]
convolution_mask_grande_data = convolution_mask_grande[grid.T == 1]

convolution_locale_data = convolution_locale[grid.T == 1]
convolution_grande_data = convolution_grande[grid.T == 1]

# FIRST STEP DIVIDE  
step1 = convolution_locale_data / convolution_mask_locale_data

fig_step1 = ax1.imshow(step1, interpolation='nearest')
fig10.colorbar(fig_step1,ax=ax1)
ax1.set_xlabel("X (arcmin)")
ax1.set_ylabel("Y (arcmin)")

# SECOND STEP DIVIDE
step2 = convolution_grande_data / convolution_mask_grande_data

fig_step2 = ax2.imshow(step2, interpolation='nearest')
fig10.colorbar(fig_step2,ax=ax2)
ax2.set_xlabel("X (arcmin)")
ax2.set_ylabel("Y (arcmin)")

# SUBSTRACT BOTH RESULTS
S_N_map = step1 - step2

fig_S_N_map = ax3.imshow(S_N_map, interpolation='nearest')
fig10.colorbar(fig_S_N_map,ax=ax3)
ax3.set_xlabel("X (arcmin)")
ax3.set_ylabel("Y (arcmin)")

fig10.tight_layout()        
fig10.savefig(outname10)

但我遇到了一个问题:最后,我需要得到与热图相同的东西。但是当我使用 grid.T 条件处理我的数组时,我的二维数组变成了一维数组,我无法进行操作。

您对我如何处理有任何想法吗? 也许不是很清楚,我很抱歉我的英语很差。

谢谢!

编辑:

变量 grid.T 是一个二进制数组(0 或 1),它指示我的像素中是否有星星(值 1)或什么都没有(值 0)。

变量convolution_mask_local 表示前一个grid.T 由一个高斯卷积。也是一个二维数组

OliverW 的解决方案。 :

当我用 OliverW. 提供的解决方案更新我的脚本时,我得到了这个:

fig10, (ax1, ax2, ax3) = plt.subplots(1,3)

fig = plt.gcf()
fig.set_size_inches(16, 9)

mask = binary_mask == 0

A = np.ma.masked_array(convolution_locale, mask = mask)
B = np.ma.masked_array(convolution_mask_locale, mask = mask)

C = np.ma.masked_array(convolution_grande, mask = mask)
D = np.ma.masked_array(convolution_mask_grande, mask =mask)

step1 = A/B
step2 = C/D


fig_step1 = ax1.imshow(step1, interpolation='nearest')
fig10.colorbar(fig_step1,ax=ax1)
ax1.set_xlabel("X (arcmin)")
ax1.set_ylabel("Y (arcmin)")


fig_step2 = ax2.imshow(step2, interpolation='nearest')
fig10.colorbar(fig_step2,ax=ax2)
ax2.set_xlabel("X (arcmin)")
ax2.set_ylabel("Y (arcmin)")

# SUBSTRACT BOTH RESULTS
S_N_map = step1 - step2

fig_S_N_map = ax3.imshow(S_N_map, interpolation='nearest')
fig10.colorbar(fig_S_N_map,ax=ax3)
ax3.set_xlabel("X (arcmin)")
ax3.set_ylabel("Y (arcmin)")

fig10.tight_layout()       
fig10.savefig(outname10)

我得到了这些情节(第二个似乎工作得很好,但由于未知原因不是第一个):

【问题讨论】:

  • 变量grid是什么? convolution_mask_locale 是什么?请把你的例子变成minimal, complete and verifiable example
  • @OliverW。好的,抱歉 OliverW,我编辑了我的问题,以便尽可能清晰。由于我有很多细节,我可能忘记了一些东西;)

标签: python arrays numpy matplotlib


【解决方案1】:

您似乎对可视化二维数组感兴趣,其中一些元素可以被忽略(屏蔽)。

幸运的是,这个功能存在于 numpy (numpy's masked arrays) 下,matplotlib 也可以使用它们。

下面是一个例子:

>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> a = np.random.random_integers(0,1, (3,3))  # generate some fake data
>>> a
array([[1, 1, 0],
       [0, 1, 0],
       [1, 0, 0]])
>>> mask = a == 0
>>> b = np.random.random_integers(0,9, a.shape) # more fake data
>>> c = np.random.random_integers(1,9, a.shape) # more fake data
>>> b
array([[9, 5, 2],
       [9, 7, 5],
       [4, 4, 2]])
>>> c
array([[4, 9, 4],
       [5, 5, 9],
       [5, 7, 3]])
>>> B = np.ma.masked_array(b, mask=mask)  # initialize a masked array
>>> C = np.ma.masked_array(c, mask=mask)
>>> B
masked_array(data =
 [[9 5 --]
 [-- 7 --]
 [4 -- --]],
             mask =
 [[False False  True]
 [ True False  True]
 [False  True  True]],
       fill_value = 999999)
>>> C
masked_array(data =
 [[4 9 --]
 [-- 5 --]
 [5 -- --]],
             mask =
 [[False False  True]
 [ True False  True]
 [False  True  True]],
       fill_value = 999999)
>>> B/C  # you can divide these 2D matrices element-wise, the mask is retained
masked_array(data =
 [[2.25 0.5555555555555556 --]
 [-- 1.4 --]
 [0.8 -- --]],
             mask =
 [[False False  True]
 [ True False  True]
 [False  True  True]],
       fill_value = 1e+20)
>>> (b/c)[~mask]
array([ 2.25      ,  0.55555556,  1.4       ,  0.8       ])

注意掩码数组BC 如何保持其二维形状,而逻辑索引数组(b/c)[~mask] 已获得一维形状。这是正常的,并且由于索引的工作方式:numpy 无法预先知道逻辑索引数组是否可以用 strides 表示(通常不能),因此它会使数组变平。但是,使用掩码数组,您可以继续按照您习惯的方式工作。操作之间会保留掩码,从最后两行代码可以看出,二维数组中的值相同。

最后,您可以可视化屏蔽数组。只需致电:

plt.imshow(B/C, interpolation='none')

它会显示一个 3x3 网格,其中一些值被屏蔽(在我的例子中,这意味着它们是透明的,在白色背景上会产生白色像素)。

【讨论】:

  • 你的回答很有趣!我更了解这个过程!我正在用你的脚本编辑我的问题。但是,我不知道为什么只有一半可以正常工作。我在我的问题结束时发布我的结果;)
  • 在我的第一个情节中,我有一些不好的值(> 100)。我写了“new_step1 = step1[step1
  • @Astrolabe1993,您的第一个和第三个轴图像不是您期望的原因是因为基础值。看看比例尺;-) 当你(对于 ax3)从一个大数字中减去一个小数字时,你最终会得到一个大数字。所以 ax3 与 ax1 非常相似。对于视觉表示,我无能为力:你应该看看你是如何创建 convolution_mask_locale 和其他人的,看看为什么这些数字如此巨大(这是你所期待的吗?)。
  • @Astrolabe1993,关于你几分钟前的评论,我不清楚你想如何继续,那么你想用一维数组做什么?如果您希望它作为 2D 数组,只需使用掩码,如前所示。如果您想将其作为一维数组,请继续说明您想对一维数组做什么。
  • 好的,我为第一个操作添加了两个掩码,以便掩码大于 1 和小于 0.001 的值。我使用了“np.ma.masked_greater”和“np.ma.masked_less”。所以我得到了一张非常好的地图(我假设),现在,我试图在直方图上拟合一个高斯(我得到了错误,但这不是我的第一个问题)。如果结果好,我会和我的导师一起看看,但对我来说,听起来不错:) 非常感谢!
猜你喜欢
  • 2013-10-04
  • 1970-01-01
  • 1970-01-01
  • 2021-03-02
  • 2021-10-10
  • 1970-01-01
  • 1970-01-01
  • 2015-05-19
  • 1970-01-01
相关资源
最近更新 更多