我有一张大熊猫纸,我想根据风速的成分来控制风向。目前我有这个:
u=new2_df["U component of wind at 850 Mb over the landfall grid point"].values
v=new2_df["v component of wind at 850 Mb over the landfall grid point"].values
wind_speed=np.sqrt(u**2+v**2)
wind_dir_calc=np.arctan(v/u)
wind_dir=np.degrees(wind_dir_calc)
if np.all(u>0) & np.all(v>0):
wind_dir=360-wind_dir-180
#if np.all(u>0) and np.all(v<0):
#wind_dir=wind_dir+180
#if np.all(u<0) and np.all(v<0):
#wind_dir=180-wind_dir+180
#if np.all(u<0) and np.all(v>0):
#wind_dir=wind_dir
但是,如果执行if语句,则不会更改数组wind_dir的值。我想先使用u和v计算风向,然后在风向计算过程中根据u和v是正/负来修改风向。
答案 0 :(得分:2)
我基本上想编写我的代码,以便它可以更改单个代码 基于我提供的逻辑测试的元素。
如果我理解正确,则可以将布尔数组与numpy.where
一起使用:
jQuery
对于wind_dir[np.where((u > 0) & (v > 0))] = 180 - wind_dir
和u > 0
的所有索引,该逻辑将v > 0
中的对应值替换为wind_dir
。
这是一个示范:
180 - wind_dir
使用np.ndarray.flat
确保索引数组形状通过迭代器与值数组形状对齐。
答案 1 :(得分:0)
jpp's
flat
的替代方法是遮罩
mask = np.where((A > 0) & (B > 0))
C[mask] = 180 - C[mask]
用他的小例子,时间是相同的。
ufunc
像np.add
一样也使用where
参数。
答案 2 :(得分:0)
这有点介于评论和答案之间,因为它是在解决问题,而不是完全按照要求回答问题,但是:
if np.all(u>0) & np.all(v>0)
时, all 的条件为负。因此,如果有任何正值,则不会更改任何数据点。如果希望每个数据点仅基于该测量值,则需要在数组上广播条件,而不是使用聚合all
。 2。 wind_dir=360-wind_dir-180
是一种相当复杂的写作方式wind_dir=180-wind_dir
,我不明白为什么要这么做。如果要在第三象限中获取角度,则应执行wind_dir=180+wind_dir
。您当前的代码将角度放置在第二个象限中。如果您有wind_dir=360-(180-wind_dir)
,那将更有意义,尽管它仍然非常令人费解。
这不能区分第二象限和第四象限。
numpy具有一个函数arctan2,该函数带有两个参数,并根据这些参数给出的点给出一个有符号的角度(请注意y坐标是第一个参数)。
< / li>