1

我有一列包含不同长度的列表,如下所示,并希望在每个独立数组上创建一个并行的 np.diff。

import polars as pl
import numpy as np
np.random.seed(0)
ragged_arrays = [np.random.randint(10, size=np.random.choice(range(10))) for _ in range(5)]

df = pl.DataFrame({'values':ragged_arrays})
df

shape: (5, 1)
┌───────────────────┐
│ values            │
│ ---               │
│ object            │
╞═══════════════════╡
│ [0 3 3 7 9]       │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ [5 2 4]           │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ [6 8 8 1 6 7 7]   │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ [1 5 9 8 9 4 3 0] │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ [5 0 2]           │
└───────────────────┘

我试图像这样简单地应用 np.diff :

df.select([
    np.diff(pl.col("values"))
])

但它给了我这个错误:

ValueError: diff requires input that is at least one dimensional

看起来目前不支持这种类型的矢量化,但是有什么解决方法可以用极坐标实现同样的事情吗?我想避免在运行它之前按长度对数组进行分组。

4

1 回答 1

1

请注意,您创建DataFrame的类型Object几乎从来都不是您想要的。Polars 不知道如何处理这个 dtype。

我对您的示例进行了一些修改,以创建一个参差不齐的 dtype 数组pl.List

有一个特殊的命名空间expression.arr可以让您访问专门为dtype设计Series的表达式。List

至此,polars>=0.13.8包括arr.diff.

np.random.seed(0)
ragged_arrays = [pl.Series(np.random.randint(10, size=np.random.choice(range(10)))) for _ in range(5)]

(pl.DataFrame({
    "values": ragged_arrays
}).with_columns([
    pl.col("values").arr.diff().alias("values_diff")
]))

这产生

shape: (5, 2)
┌───────────────┬───────────────────┐
│ values        ┆ values_diff       │
│ ---           ┆ ---               │
│ list [i64]    ┆ list [i64]        │
╞═══════════════╪═══════════════════╡
│ [0, 3, ... 9] ┆ [null, 3, ... 2]  │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ [5, 2, 4]     ┆ [null, -3, 2]     │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ [6, 8, ... 7] ┆ [null, 2, ... 0]  │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ [1, 5, ... 0] ┆ [null, 4, ... -3] │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ [5, 0, 2]     ┆ [null, -5, 2]     │
└───────────────┴───────────────────┘

于 2022-03-02T16:39:19.890 回答