如果有两个条件的陈述

时间:2018-07-02 14:46:35

标签: python arrays numpy

我有一张大熊猫纸,我想根据风速的成分来控制风向。目前我有这个:

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是正/负来修改风向。

3 个答案:

答案 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]

用他的小例子,时间是相同的。

ufuncnp.add一样也使用where参数。

答案 2 :(得分:0)

这有点介于评论和答案之间,因为它是在解决问题,而不是完全按照要求回答问题,但是:

  1. 按照单词“ all”的建议进行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),那将更有意义,尽管它仍然非常令人费解。

  1. 这不能区分第二象限和第四象限。

  2. numpy具有一个函数arctan2,该函数带有两个参数,并根据这些参数给出的点给出一个有符号的角度(请注意y坐标是第一个参数)。

    < / li>