【问题标题】:If, else statement for large array大型数组的 if 和 else 语句
【发布时间】:2018-12-05 09:41:34
【问题描述】:

我想在风玫瑰图(极地玫瑰图)上绘制一些风速和风向数据,但我使用的库(windrose)似乎不喜欢你给它一个负风向。因此,我试图将 360 度添加到所有负值,认为它应该绘制。我尝试执行本文if else in a list comprehension 中显示的方法,但我的数组中仍然有很多负数。

 wind_speed=np.sqrt(u**2+v**2)
 wind_dir_calc=np.arctan(v/u)
 wind_dir=np.degrees(wind_dir_calc)

 [x+360 if x<0 else x+0 for x in wind_dir]

 np.set_printoptions(threshold=np.inf)
 print(wind_dir)

Sample output:
 [-6.34019175  84.6607632  -58.73626831  55.40771131  73.87242417
 66.70543675  48.0127875   50.71059314  52.27500496  38.15722659
 37.50414236  48.14495746  -2.20259816  16.53483786  38.75162833
 19.0466243  -58.67130713 -63.00416161 -65.41842552 -74.96956948
-74.23281746 -68.36911316 -46.46880071 -83.26398879 -80.75388725...]

【问题讨论】:

  • 你对wind_dir.min()有什么看法?
  • -90.0。这将向我表明适当的南风(从北到南的风)。
  • 不,我没有,这似乎已经解决了。这么简单的事情,谢谢。
  • @EliTurasky 您也可以投票/标记对您有帮助的答案。 :)

标签: python arrays list numpy list-comprehension


【解决方案1】:

你的逻辑是正确的。您只需要将列表理解分配给一个变量。列表推导不是就地操作。例如:

wind_dir = [x+360 if x<0 else x+0 for x in wind_dir]

但是,由于您使用的是 NumPy 数组,我建议您使用就地矢量化操作:

wind_dir[wind_dir < 0] += 360

要创建新数组,可以使用numpy.where:

wind_dir = np.where(wind_dir < 0, wind_dir + 360, wind_dir)

【讨论】:

  • 为什么要创建一个新数组?这是一个相当缓慢的操作,尤其是对于大型数组。
  • @Scotty1-,我没有声称你应该。但它是更复杂任务的一种选择,也是新用户查看不同方法的好主意。事实上,我的回答说我推荐一个就地...
  • 好的,我同意这一点。 :)
【解决方案2】:

在许多情况下,对数组使用布尔索引掩码是最好的解决方案,因为它比推导式更快、更容易。这是矢量化的,因此速度很快,并且是大多数 pythonic/numpy 风格的:

wind_dir[wind_dir < 0] += 360

【讨论】:

  • 嗯?为什么我得到了反对票?我的答案是正确的,并且是第一个答案。我同意 jpp 发布了一个更全面的答案,因此应该被标记为已接受,但不赞成投票。
猜你喜欢
  • 2014-11-27
  • 1970-01-01
  • 1970-01-01
  • 2014-11-11
  • 1970-01-01
  • 2014-02-15
  • 2019-04-09
相关资源
最近更新 更多