有没有办法对极地中参差不齐的阵列进行矢量化
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] │
└───────────────┴───────────────────┘
我有一列包含不同长度的列表,如下所示,我想在每个独立数组上进行并行 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] │
└───────────────┴───────────────────┘