python 如何在polars datafame中使用numpy arctan2?

t9eec4r0  于 2023-02-11  发布在  Python
关注(0)|答案(3)|浏览(109)

我尝试在polars Dataframe 中使用numpy arctan2。代码在polars之外工作

import polars as pl
import numpy as np 
data = pl.from_dict(
{'v': [-4.293,-2.4659,-1.8378,-0.2821,-4.5649,-3.8128,-7.4274,3.3443,3.8604,-4.2200],
'u': [-11.2268,6.3478,7.1681,3.4986,2.7320,-1.0695,-10.1408,11.2327,6.6623,-8.1412]})

这很管用

v = data ['v'].to_list()
u = data ['u'].to_list()
wd = np.round(np.degrees(np.arctan2(v,u).tolist())+180,3)
print(wd)

我尝试了几十种不同的想法

data.with_columns([ ( np.degrees( np.arctan2( pl.col('v'), pl.col('u'),None )  ) + 180  ).alias('wd_ck')  ]).head()
data['wd']=data.select([pl.col('v'),pl.col('u')]).apply(np.arctan2,return_dtype=pl.Float64)

我尝试在极坐标 Dataframe 内使用arctans2从v,u计算wd
我用的是windows 11,python 3.9.15,numpy 1.22.3,polars 0.16.2

sd2nnvve

sd2nnvve1#

尝试使用map

data.with_columns(
    [
        pl.map(
            ["v", "u"],
            lambda s: np.degrees(np.arctan2(s[0], s[1], None)) + 180)
        .round(3)
        .alias("wd_ck")
    ]
)
shape: (10, 3)
┌─────────┬──────────┬─────────┐
│ v       ┆ u        ┆ wd_ck   │
│ ---     ┆ ---      ┆ ---     │
│ f64     ┆ f64      ┆ f64     │
╞═════════╪══════════╪═════════╡
│ -4.293  ┆ -11.2268 ┆ 20.926  │
│ -2.4659 ┆ 6.3478   ┆ 158.771 │
│ -1.8378 ┆ 7.1681   ┆ 165.62  │
│ -0.2821 ┆ 3.4986   ┆ 175.39  │
│ ...     ┆ ...      ┆ ...     │
│ -7.4274 ┆ -10.1408 ┆ 36.22   │
│ 3.3443  ┆ 11.2327  ┆ 196.58  │
│ 3.8604  ┆ 6.6623   ┆ 210.09  │
│ -4.22   ┆ -8.1412  ┆ 27.4    │
└─────────┴──────────┴─────────┘
2o7dmzc5

2o7dmzc52#

至于其他的答案,他们没有利用arctan2和degrees是ufuncs这一事实,你可以直接作为表达式执行。
有点令人困惑的是arctan2有两个参数,如何让polars对一个有两个参数的函数进行运算并不明显,这个问题的答案是使用reduce
例如,

df.select(pl.reduce(np.arctan2, [pl.col('v'), pl.col('u')]))

shape: (10, 1)
┌───────────┐
│ v         │
│ ---       │
│ f64       │
╞═══════════╡
│ -2.77636  │
│ -0.370523 │
│ -0.25098  │
│ -0.080458 │
│ ...       │
│ -2.509433 │
│ 0.289372  │
│ 0.525164  │
│ -2.663372 │
└───────────┘

对于degree,由于它只带一个参数,因此可以直接使用它,并且在相同的上下文中仍然具有两个函数,以及添加180和舍入...

df.select((np.degrees(pl.reduce(np.arctan2, [pl.col('v'), pl.col('u')]))+180).round(3))

shape: (10, 1)
┌─────────┐
│ v       │
│ ---     │
│ f64     │
╞═════════╡
│ 20.926  │
│ 158.771 │
│ 165.62  │
│ 175.39  │
│ ...     │
│ 36.22   │
│ 196.58  │
│ 210.09  │
│ 27.4    │
└─────────┘
djmepvbi

djmepvbi3#

编辑:在评论中@bgk反馈后扩展答案

要在 Dataframe 中创建列wd

In [23]: data.with_columns([
    ...:     pl.struct(['v', 'u']).apply(
    ...:         lambda x: np.round(np.degrees(np.arctan2(x['v'], x['u'])) + 180, 3)
    ...:     ).alias('wd'),
    ...: ])
    ...:
Out[23]:
shape: (10, 3)
┌─────────┬──────────┬─────────┐
│ v       ┆ u        ┆ wd      │
│ ---     ┆ ---      ┆ ---     │
│ f64     ┆ f64      ┆ f64     │
╞═════════╪══════════╪═════════╡
│ -4.293  ┆ -11.2268 ┆ 20.926  │
│ -2.4659 ┆ 6.3478   ┆ 158.771 │
│ -1.8378 ┆ 7.1681   ┆ 165.62  │
│ -0.2821 ┆ 3.4986   ┆ 175.39  │
│ ...     ┆ ...      ┆ ...     │
│ -7.4274 ┆ -10.1408 ┆ 36.22   │
│ 3.3443  ┆ 11.2327  ┆ 196.58  │
│ 3.8604  ┆ 6.6623   ┆ 210.09  │
│ -4.22   ┆ -8.1412  ┆ 27.4    │
└─────────┴──────────┴─────────┘

要获得相同的结果而不转换为列表

wd = np.round(np.degrees(np.arctan2(data['v'], data['u'])) + 180, 3)

其中arctan计算为v / u

np.arctan2(data['v'], data['u'])

然后将np.degrees

np.degrees(np.arctan2(data['v'], data['u'])) + 180

round

np.round(np.degrees(np.arctan2(data['v'], data['u'])) + 180, 3)

快速测试以检查示例的结果:

In [11]: all(
    ...:     np.round(np.degrees(np.arctan2(data['v'], data['u'])) + 180, 3)
    ...:     == np.round(np.degrees(np.arctan2(data['v'].to_list(), data['u'].to_list()).tolist()) + 180, 3)
    ...: )
    ...:
Out[11]: True

相关问题