将numpy条件转换为常规python2.7语法

2024-04-30 02:58:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我讲了一行代码,我想把它从numpy语法转换成常规的python2.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)

什么??你知道吗

谢谢你的帮助。你知道吗


Tags: 代码httpsnumpygithubcom来源语法item
2条回答

试试这个:

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

主要区别在于,大多数操作符应用于普通Python列表中的list对象并返回单个结果,而它们返回一个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]

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

SunAz=SunAz + (SunAz < 0) * 360

(SunAz < 0)创建一个布尔数组,如果角度为负,则为True,否则为false。将False乘以常数得到0True被解释为1。这一行实际上是这样写的,“如果角度为负,则将其移动360度,否则将其保留”。你知道吗

所以更直译的是:

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

相关问题 更多 >