有没有办法对极地中参差不齐的阵列进行矢量化

Is there a way to vectorise over ragged arrays in polars

我有一列包含不同长度的列表,如下所示,我想在每个独立数组上进行并行 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

目前似乎不支持这种类型的矢量化,但是否有任何变通方法可以用极坐标实现同样的事情?我想避免在 运行 之前按长度对数组进行分组。

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

我稍微调整了你的例子来创建一个参差不齐的 dtype 数组 pl.List

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

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]     │
└───────────────┴───────────────────┘