如何将numpy数组掩码(布尔)转换为浮点数或整数

0 投票
1 回答
5528 浏览
提问于 2025-04-18 09:02

我正在尝试用一个包含 timelatlon 的数组来创建一个出现频率的地图。最终我想得到一个二维的 lat/lon 数组,里面记录着频率。下面的代码展示了我的思路,但在步骤 d 的时候,我在把反转的布尔数组转换成数字时遇到了问题。我偶然发现了一种方法可以做到这一点,但我不知道为什么它有效(np.mean)。我不明白为什么 np.mean 会把布尔值变成浮点数,但却没有沿着请求的轴计算平均值。我不得不再次使用 np.mean 才得到了想要的结果。我觉得一定有更好的方法可以把布尔数组转换成浮点数或整数。如果你有更好的办法来完成这个任务,请告诉我。我的 numpy 技能还不够强,这也是我能想到的唯一方法。

import numpy as np

# test 3D array in time, lat, lon; values are percents
# real array is size=(30,721,1440)

a = np.random.random_integers(0,100, size=(3,4,5))
print(a)

# Exclude all data outside the interval 0 - 20 (first quintile)
# Repeat for 21-40, 41-60, 61-80, 81-100

b = np.ma.masked_outside(a, 0, 20)
print "\n\nMasked array:  "
print(b)

# Because mask is false where data within quintile, need to invert

c = [~b.mask] 
print "\n\nInverted mask:  "
print(c)

# Accidental way to turn True/False to 1./0., but that's what I want

d = np.mean(c, axis = 0)  
print "\n\nWhy does this work? How should I be doing it?"
print(d)

# This is the mean I want.  Gives desired end result

e = np.mean(d, axis = 0)
print "\n\nFrequency Map"
print(e)

我该如何把我(反转的)数组掩码中的布尔值转换成数字(1 和 0)呢?

1 个回答

3

之所以“有效”,是因为你的 c 其实不是你想的那样:

>>> c
[array([[[False, False, False, False, False],
        [False, False, False, False,  True],
        [False, False, False, False, False],
        [False, False, False, False, False]],

       [[False, False, False, False, False],
        [False, False, False, False,  True],
        [False, False, False,  True, False],
        [False, False, False, False,  True]],

       [[False, False, False, False, False],
        [False, False, False, False, False],
        [False,  True, False, False, False],
        [ True, False,  True,  True, False]]], dtype=bool)]
>>> type(c)
<type 'list'>

它不是一个数组,而是一个包含数组的列表。所以当你取

d = np.mean(c, axis = 0)  

的时候,你实际上是在计算一个只有一个元素的列表的平均值,而这个元素就是它自己(不过会被转换成浮点数,因为这就是 mean 的作用,而 float(True) == 1.0)。

所以,去掉那些不必要的括号:

>>> c = ~b.mask
>>> output = c.mean(axis=0)
>>> output
array([[ 0.        ,  0.        ,  0.        ,  0.        ,  0.        ],
       [ 0.        ,  0.        ,  0.        ,  0.        ,  0.66666667],
       [ 0.        ,  0.33333333,  0.        ,  0.33333333,  0.        ],
       [ 0.33333333,  0.        ,  0.33333333,  0.33333333,  0.33333333]])
>>> np.allclose(output, e)
True

顺便说一下,把布尔值转换成浮点数或整数的标准方法是用 astype,比如 c.astype(float)c.astype(int)。不过说实话,有时候我懒得这么做,直接写 c + 0.0c + 0。不过这可不是我告诉你的哦。

撰写回答