如何将numpy数组掩码(布尔)转换为浮点数或整数
我正在尝试用一个包含 time
、lat
和 lon
的数组来创建一个出现频率的地图。最终我想得到一个二维的 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.0
或 c + 0
。不过这可不是我告诉你的哦。