如果是,则声明大型数组

时间:2018-06-26 15:41:30

标签: python arrays list numpy list-comprehension

我想在风玫瑰上绘制一些风速和风向数据(极地玫瑰图),但是当您向其输入负风向时,似乎我正在使用的库(风玫瑰)不喜欢它。因此,我试图将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...]

2 个答案:

答案 0 :(得分:2)

在许多情况下,为数组使用布尔值索引掩码是最好的解决方案,因为它比理解更快,更容易。这是矢量化的,因此是最快的,并且是大多数pythonic / numpy样式:

wind_dir[wind_dir < 0] += 360

答案 1 :(得分:2)

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

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)