我正在尝试使用time
,lat
,lon
数组创建出现频率的地图。我应该得到一个2d lat
/ lon
个频率数组。下面的代码概述了我的方法,当我将反向布尔数组掩码转换为数值时,我在步骤d遇到了问题。我偶然发现了一种方法,但我不知道它为什么会起作用(np.mean
)。我不明白为什么np.mean
将布尔值变为浮点数,但实际上并没有计算沿请求轴的平均值。我不得不再次申请np.mean
以获得所需的结果。我觉得必须有一个正确的方法来将布尔数组转换为浮点数或整数。此外,如果你能想出一个更好的方法来完成任务,那就开火了。我的笨拙的魔力很弱,这是我能想到的唯一方法。
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)?
答案 0 :(得分:2)
它“有效”,因为你的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)
你取的是一个元素列表的平均值,它本身就是(但转换为float,因为这是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
。但是你没有听到我的消息。