我是Iris库的新手,需要计算heat index,这是温度和相对湿度的多元非线性函数,类似于$ HI = temp + rh + temp * rh + temp ^ 2 * rh + rh ^ 2 * temp $。这里,temp的单位为华氏度,rh的单位为1.
然而,Iris立方体不会添加不同的单位:
In [147]: HI = temp + rh + temp*rh + temp**2*rh + rh**2*temp
---------------------------------------------------------------------------
NotYetImplementedError Traceback (most recent call last)
<ipython-input-147-675ea72a5d06> in <module>()
----> 1 HI = temp + rh + temp*rh + temp**2*rh + rh**2*temp
/Users/me/anaconda/lib/python2.7/site-packages/iris/cube.pyc in __add__(self, other)
2596
2597 def __add__(self, other):
-> 2598 return iris.analysis.maths.add(self, other, ignore=True)
2599 __radd__ = __add__
2600
/Users/me/anaconda/lib/python2.7/site-packages/iris/analysis/maths.pyc in add(cube, other, dim, ignore, in_place)
166 op = operator.iadd if in_place else operator.add
167 return _add_subtract_common(op, 'addition', 'added', cube, other, dim=dim,
--> 168 ignore=ignore, in_place=in_place)
169
170
/Users/me/anaconda/lib/python2.7/site-packages/iris/analysis/maths.pyc in _add_subtract_common(operation_function, operation_noun, operation_past_tense, cube, other, dim, ignore, in_place)
216 """
217 _assert_is_cube(cube)
--> 218 _assert_matching_units(cube, other, operation_noun)
219
220 if isinstance(other, iris.cube.Cube):
/Users/me/anaconda/lib/python2.7/site-packages/iris/analysis/maths.pyc in _assert_matching_units(cube, other, operation_noun)
132 raise iris.exceptions.NotYetImplementedError(
133 'Differing units (%s & %s) %s not implemented' %
--> 134 (cube.units, other.units, operation_noun))
135
136
NotYetImplementedError: Differing units (Fahrenheit & 1) addition not implemented
如果我将数据调用为numpy数组,那么这是一种解决方法,例如: heatIndex = -42.379 + temp.data + rh.data + temp.data 2 + rh.data 2 但这似乎首先打败了使用Iris的目的,并且需要重新编写元数据。
这可能与虹膜立方体有关吗?我是否缺少一个可以让这种情况发生的无单元udunit?
注意:如果没有从错误中清除,我正在运行Python 2.7(和Iris 1.7)。
答案 0 :(得分:0)
如果我把数据称为numpy数组......这似乎首先打败了使用Iris的目的,并且需要重新编写元数据。
首先,利用numpy和所有令人难以置信的scipy生态系统是Iris的强大功能。在Iris中存在功能的地方,最好使用它而不是自己管理元数据,但如果某些东西不存在,那么希望它不应该太难实现。
在你的情况下,你可能想要自己更新一些元数据(即Iris不会知道这个数学变换会产生代表&#34;热指数&#34;的数据)。
热量指数似乎应该是华氏温度,并且将华氏度立方体添加到标量立方体会导致此错误。最简单的解决方案可能是将相对湿度标量 数据 (即不是 立方体 )添加到温度:
rh = rh.data
heat_index = temp + rh + temp*rh + temp**2*rh + rh**2*temp
heat_index.rename('heat_index')
assert heat_index.units == 'Fahrenheit'
答案 1 :(得分:0)
当您开始使用数据阵列时,我认为您处于正确的位置,但可以使它更清晰。关键是首先复制温度立方体并从那里开始工作
C1 = -42.379
C2 = 2.04901523
# etc
def get_heat_index(temp, rh):
'''Calculate the heat index as defined by George Winterling'''
# make sure we are using the right temperature units
# other checks could be implemented as assertions
temp.convert_units('Fahrenheit')
# start by copying the temperature cube
heat_index = temp
# fix the name of the cube to be returned
heat_index.rename('heat_index')
# C2 - do this first as already have temperature data
heat_index.data = (C1 + C2*temp.data +
C3*rh.data +
# etc
C9*temp.data**2*rh.data**2)
return heat_index