将numpy条件转换为常规python 2.7语法



我进入了一行代码,我想将其从numpy语法转换为常规python 2.7语法:

SunAz=SunAz + (SunAz < 0) * 360

来源:https://github.com/Sandia-Labs/PVLIB_Python/blob/master/pvlib/pvl_ephemeris.py#L147

如果我们假设numpy数组是一维的,它能被翻译成常规的python 2.7语法吗

newSunAz = []
for item in SunAz:
    if item < 0:
        newItem = item + item*360
        newSunAz.append(newItem)
    else:
        newSunAz.append(item)

谢谢你的帮助。

我不确定这是否是翻译。线路

SunAz=SunAz + (SunAz < 0) * 360

(SunAz < 0)创建一个布尔数组,如果角度为负数,则为True,否则为false。将False乘以常数得到0,并且True被解释为1。这句话实际上是说,"如果为负数,则将角度偏移360度,否则保持不变"。

因此,更字面的翻译如下:

SunAz = [angle + 360 if angle < 0 else angle for angle in SunAz]

试试这个:

new_sun_az = [i+360 if i > 0 else i for i in sun_az]

主要区别在于,大多数运算符应用于普通Python列表中的列表对象并返回单个结果,而它们返回一个numpy数组,其中每个项都是应用于numpy数组原始数组上相应项的运算结果。

>>> import numpy as np
>>> plainlist = range(5)
>>> plainlist
[0, 1, 2, 3, 4]
>>> plainlist > 5   # single result
True
>>> nparray = np.array(plainlist)
>>> nparray
array([0, 1, 2, 3, 4])
>>> nparray > 5    # array of results
array([False, False, False, False, False], dtype=bool)
>>> 

[更新]

迈克的回答是对的。我最初的回答是:

new_sun_az = [i+i*360 if i > 0 else i for i in sun_az]

最新更新