在掩码条件后获取2D数组

2024-09-27 09:34:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个关于我的剧本的问题,我希望你的帮助或任何想法来解决我的问题。在

我有一个二维数组的数据,我想把它除以另一个二维数组。到目前为止,这不是问题。 但我提出了一个条件:这两个数组都必须考虑二进制掩码,并且只取像素=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条件处理数组时,我的2D数组变成了1D数组,我不能进行操作。在

你知道我该怎么处理吗? 也许不太清楚,我很抱歉我的英语很差。在

谢谢你!在

编辑:

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

enter image description here

变量卷积_mask_local表示前一个由高斯卷积的网格.T。它也是一个二维数组

enter image description here

OliverW的解决方案。:

当我用OliverW给出的解决方案更新脚本时,我得到了:

^{pr2}$

我得到了这些情节(第二个情节似乎很好,但第一个情节却因未知原因而不适用):

enter image description here


Tags: datafigmask数组localegridsetgrande
1条回答
网友
1楼 · 发布于 2024-09-27 09:34:10

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

幸运的是,这个功能存在于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如何保持其2D形状,而逻辑索引数组(b/c)[~mask]获得了1D形状。这是正常的,而且由于索引的工作方式:numpy不能预先知道逻辑索引数组是否可以用跨步表示(一般来说,它不能),所以它会使数组变平。但是,使用掩码数组,您可以继续按照您习惯的方式工作。掩码在操作之间保留,正如您从最后两行代码中看到的,相同的值在2D数组中。在

最后,您可以可视化蒙版数组。打电话给:

^{pr2}$

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

相关问题 更多 >

    热门问题