Path: blob/main/py-polars/tests/unit/operations/namespaces/array/test_array.py
8353 views
from __future__ import annotations12import datetime3from typing import Any45import pytest67import polars as pl8from polars.exceptions import ComputeError, InvalidOperationError9from polars.testing import assert_frame_equal, assert_series_equal101112def test_arr_min_max() -> None:13s = pl.Series("a", [[1, 2], [4, 3]], dtype=pl.Array(pl.Int64, 2))14assert s.arr.max().to_list() == [2, 4]15assert s.arr.min().to_list() == [1, 3]1617s_with_null = pl.Series("a", [[None, 2], None, [3, 4]], dtype=pl.Array(pl.Int64, 2))18assert s_with_null.arr.max().to_list() == [2, None, 4]19assert s_with_null.arr.min().to_list() == [2, None, 3]202122def test_arr_mean_median_var_std() -> None:23s = pl.Series("a", [[1, 2], [4, 3]], dtype=pl.Array(pl.Int64, 2))24assert s.arr.mean().to_list() == [1.5, 3.5]25assert s.arr.median().to_list() == [1.5, 3.5]26assert s.arr.var().to_list() == [0.5, 0.5]27assert round(s.arr.std().to_list()[0], 5) == 0.707112829s_with_null = pl.Series("a", [[3, 4], None, [None, 2]], dtype=pl.Array(pl.Int64, 2))30assert s_with_null.arr.mean().to_list() == [3.5, None, 2.0]31assert s_with_null.arr.median().to_list() == [3.5, None, 2.0]32assert s_with_null.arr.var().to_list() == [0.5, None, None]33assert round(s_with_null.arr.std().to_list()[0], 5) == 0.70711343536def test_array_min_max_dtype_12123() -> None:37df = pl.LazyFrame(38[pl.Series("a", [[1.0, 3.0], [2.0, 5.0]]), pl.Series("b", [1.0, 2.0])],39schema_overrides={40"a": pl.Array(pl.Float64, 2),41},42)4344df = df.with_columns(45max=pl.col("a").arr.max().alias("max"),46min=pl.col("a").arr.min().alias("min"),47)4849assert df.collect_schema() == {50"a": pl.Array(pl.Float64, 2),51"b": pl.Float64,52"max": pl.Float64,53"min": pl.Float64,54}5556out = df.select(pl.col("max") * pl.col("b"), pl.col("min") * pl.col("b")).collect()5758assert_frame_equal(out, pl.DataFrame({"max": [3.0, 10.0], "min": [1.0, 4.0]}))596061@pytest.mark.parametrize(62("data", "expected_sum", "dtype"),63[64([[1, 2], [4, 3]], [3, 7], pl.Int64),65([[1, None], [None, 3], [None, None]], [1, 3, 0], pl.Int64),66([[1.0, 2.0], [4.0, 3.0]], [3.0, 7.0], pl.Float32),67([[1.0, None], [None, 3.0], [None, None]], [1.0, 3.0, 0], pl.Float32),68([[True, False], [True, True], [False, False]], [1, 2, 0], pl.Boolean),69([[True, None], [None, False], [None, None]], [1, 0, 0], pl.Boolean),70],71)72def test_arr_sum(73data: list[list[Any]], expected_sum: list[Any], dtype: pl.DataType74) -> None:75s = pl.Series("a", data, dtype=pl.Array(dtype, 2))76assert s.arr.sum().to_list() == expected_sum777879@pytest.mark.may_fail_cloud80def test_array_lengths_zwa() -> None:81assert pl.Series("a", [[], []], pl.Array(pl.Null, 0)).arr.len().to_list() == [0, 0]82assert pl.Series("a", [None, []], pl.Array(pl.Null, 0)).arr.len().to_list() == [83None,840,85]86assert pl.Series("a", [None], pl.Array(pl.Null, 0)).arr.len().to_list() == [None]8788assert pl.Series("a", [], pl.Array(pl.Null, 0)).arr.len().to_list() == []899091def test_array_lengths() -> None:92df = pl.DataFrame(93[94pl.Series("a", [[1, 2, 3]], dtype=pl.Array(pl.Int64, 3)),95pl.Series("b", [[4, 5]], dtype=pl.Array(pl.Int64, 2)),96]97)98out = df.select(pl.col("a").arr.len(), pl.col("b").arr.len())99expected_df = pl.DataFrame(100{"a": [3], "b": [2]},101schema={"a": pl.get_index_type(), "b": pl.get_index_type()},102)103assert_frame_equal(out, expected_df)104105assert pl.Series("a", [], pl.Array(pl.Null, 1)).arr.len().to_list() == []106assert pl.Series(107"a", [[1, 2, 3], None, [7, 8, 9]], pl.Array(pl.get_index_type(), 3)108).arr.len().to_list() == [3, None, 3]109110111@pytest.mark.parametrize(112("as_array"),113[True, False],114)115def test_arr_slice(as_array: bool) -> None:116df = pl.DataFrame(117{118"arr": [[1, 2, 3], [10, 2, 1]],119},120schema={"arr": pl.Array(pl.Int64, 3)},121)122123assert df.select([pl.col("arr").arr.slice(0, 1, as_array=as_array)]).to_dict(124as_series=False125) == {"arr": [[1], [10]]}126assert df.select([pl.col("arr").arr.slice(1, 1, as_array=as_array)]).to_dict(127as_series=False128) == {"arr": [[2], [2]]}129assert df.select([pl.col("arr").arr.slice(-1, 1, as_array=as_array)]).to_dict(130as_series=False131) == {"arr": [[3], [1]]}132assert df.select([pl.col("arr").arr.slice(-2, 1, as_array=as_array)]).to_dict(133as_series=False134) == {"arr": [[2], [2]]}135assert df.select([pl.col("arr").arr.slice(-2, 2, as_array=as_array)]).to_dict(136as_series=False137) == {"arr": [[2, 3], [2, 1]]}138return139140141@pytest.mark.parametrize(142("as_array"),143[True, False],144)145def test_arr_slice_on_series(as_array: bool) -> None:146vals = [[1, 2, 3, 4], [10, 2, 1, 2]]147s = pl.Series("a", vals, dtype=pl.Array(pl.Int64, 4))148assert s.arr.head(2, as_array=as_array).to_list() == [[1, 2], [10, 2]]149assert s.arr.tail(2, as_array=as_array).to_list() == [[3, 4], [1, 2]]150assert s.arr.tail(10, as_array=as_array).to_list() == vals151assert s.arr.head(10, as_array=as_array).to_list() == vals152assert s.arr.slice(1, 2, as_array=as_array).to_list() == [[2, 3], [2, 1]]153assert s.arr.slice(-5, 2, as_array=as_array).to_list() == [[1], [10]]154# TODO: there is a bug in list.slice that does not allow negative values for head155if as_array:156assert s.arr.tail(-1, as_array=as_array).to_list() == [[2, 3, 4], [2, 1, 2]]157assert s.arr.tail(-2, as_array=as_array).to_list() == [[3, 4], [1, 2]]158assert s.arr.tail(-3, as_array=as_array).to_list() == [[4], [2]]159assert s.arr.head(-1, as_array=as_array).to_list() == [[1, 2, 3], [10, 2, 1]]160assert s.arr.head(-2, as_array=as_array).to_list() == [[1, 2], [10, 2]]161assert s.arr.head(-3, as_array=as_array).to_list() == [[1], [10]]162163164def test_arr_unique() -> None:165df = pl.DataFrame(166{"a": pl.Series("a", [[1, 1], [4, 3]], dtype=pl.Array(pl.Int64, 2))}167)168169out = df.select(pl.col("a").arr.unique(maintain_order=True))170expected = pl.DataFrame({"a": [[1], [4, 3]]})171assert_frame_equal(out, expected)172173174def test_array_any_all() -> None:175s = pl.Series(176[[True, True], [False, True], [False, False], [None, None], None],177dtype=pl.Array(pl.Boolean, 2),178)179180expected_any = pl.Series([True, True, False, False, None])181assert_series_equal(s.arr.any(), expected_any)182183expected_all = pl.Series([True, False, False, True, None])184assert_series_equal(s.arr.all(), expected_all)185186s = pl.Series([[1, 2], [3, 4], [5, 6]], dtype=pl.Array(pl.Int64, 2))187with pytest.raises(ComputeError, match="expected boolean elements in array"):188s.arr.any()189with pytest.raises(ComputeError, match="expected boolean elements in array"):190s.arr.all()191192193def test_array_sort() -> None:194s = pl.Series([[2, None, 1], [1, 3, 2]], dtype=pl.Array(pl.UInt32, 3))195196desc = s.arr.sort(descending=True)197expected = pl.Series([[None, 2, 1], [3, 2, 1]], dtype=pl.Array(pl.UInt32, 3))198assert_series_equal(desc, expected)199200asc = s.arr.sort(descending=False)201expected = pl.Series([[None, 1, 2], [1, 2, 3]], dtype=pl.Array(pl.UInt32, 3))202assert_series_equal(asc, expected)203204# test nulls_last205s = pl.Series([[None, 1, 2], [-1, None, 9]], dtype=pl.Array(pl.Int8, 3))206assert_series_equal(207s.arr.sort(nulls_last=True),208pl.Series([[1, 2, None], [-1, 9, None]], dtype=pl.Array(pl.Int8, 3)),209)210assert_series_equal(211s.arr.sort(nulls_last=False),212pl.Series([[None, 1, 2], [None, -1, 9]], dtype=pl.Array(pl.Int8, 3)),213)214215216def test_array_reverse() -> None:217s = pl.Series([[2, None, 1], [1, None, 2]], dtype=pl.Array(pl.UInt32, 3))218219s = s.arr.reverse()220expected = pl.Series([[1, None, 2], [2, None, 1]], dtype=pl.Array(pl.UInt32, 3))221assert_series_equal(s, expected)222223224def test_array_arg_min_max() -> None:225s = pl.Series("a", [[1, 2, 4], [3, 2, 1]], dtype=pl.Array(pl.UInt32, 3))226expected = pl.Series("a", [0, 2], dtype=pl.get_index_type())227assert_series_equal(s.arr.arg_min(), expected)228expected = pl.Series("a", [2, 0], dtype=pl.get_index_type())229assert_series_equal(s.arr.arg_max(), expected)230231232def test_array_get() -> None:233s = pl.Series(234"a",235[[1, 2, 3, 4], [5, 6, None, None], [7, 8, 9, 10]],236dtype=pl.Array(pl.Int64, 4),237)238239# Test index literal.240out = s.arr.get(1, null_on_oob=False)241expected = pl.Series("a", [2, 6, 8], dtype=pl.Int64)242assert_series_equal(out, expected)243244# Null index literal.245out_df = s.to_frame().select(pl.col.a.arr.get(pl.lit(None), null_on_oob=False))246expected_df = pl.Series("a", [None, None, None], dtype=pl.Int64).to_frame()247assert_frame_equal(out_df, expected_df)248249# Out-of-bounds index literal.250with pytest.raises(ComputeError, match="get index is out of bounds"):251out = s.arr.get(100, null_on_oob=False)252253# Negative index literal.254out = s.arr.get(-2, null_on_oob=False)255expected = pl.Series("a", [3, None, 9], dtype=pl.Int64)256assert_series_equal(out, expected)257258# Test index expr.259with pytest.raises(ComputeError, match="get index is out of bounds"):260out = s.arr.get(pl.Series([1, -2, 100]), null_on_oob=False)261262out = s.arr.get(pl.Series([1, -2, 0]), null_on_oob=False)263expected = pl.Series("a", [2, None, 7], dtype=pl.Int64)264assert_series_equal(out, expected)265266# Test logical type.267s = pl.Series(268"a",269[270[datetime.date(1999, 1, 1), datetime.date(2000, 1, 1)],271[datetime.date(2001, 10, 1), None],272[None, None],273],274dtype=pl.Array(pl.Date, 2),275)276with pytest.raises(ComputeError, match="get index is out of bounds"):277out = s.arr.get(pl.Series([1, -2, 4]), null_on_oob=False)278279280def test_array_get_null_on_oob() -> None:281s = pl.Series(282"a",283[[1, 2, 3, 4], [5, 6, None, None], [7, 8, 9, 10]],284dtype=pl.Array(pl.Int64, 4),285)286287# Test index literal.288out = s.arr.get(1, null_on_oob=True)289expected = pl.Series("a", [2, 6, 8], dtype=pl.Int64)290assert_series_equal(out, expected)291292# Null index literal.293out_df = s.to_frame().select(pl.col.a.arr.get(pl.lit(None), null_on_oob=True))294expected_df = pl.Series("a", [None, None, None], dtype=pl.Int64).to_frame()295assert_frame_equal(out_df, expected_df)296297# Out-of-bounds index literal.298out = s.arr.get(100, null_on_oob=True)299expected = pl.Series("a", [None, None, None], dtype=pl.Int64)300assert_series_equal(out, expected)301302# Negative index literal.303out = s.arr.get(-2, null_on_oob=True)304expected = pl.Series("a", [3, None, 9], dtype=pl.Int64)305assert_series_equal(out, expected)306307# Test index expr.308out = s.arr.get(pl.Series([1, -2, 100]), null_on_oob=True)309expected = pl.Series("a", [2, None, None], dtype=pl.Int64)310assert_series_equal(out, expected)311312# Test logical type.313s = pl.Series(314"a",315[316[datetime.date(1999, 1, 1), datetime.date(2000, 1, 1)],317[datetime.date(2001, 10, 1), None],318[None, None],319],320dtype=pl.Array(pl.Date, 2),321)322out = s.arr.get(pl.Series([1, -2, 4]), null_on_oob=True)323expected = pl.Series(324"a",325[datetime.date(2000, 1, 1), datetime.date(2001, 10, 1), None],326dtype=pl.Date,327)328assert_series_equal(out, expected)329330331def test_arr_first_last() -> None:332s = pl.Series(333"a",334[[1, 2, 3], [None, 5, 6], [None, None, None]],335dtype=pl.Array(pl.Int64, 3),336)337338first = s.arr.first()339expected_first = pl.Series(340"a",341[1, None, None],342dtype=pl.Int64,343)344assert_series_equal(first, expected_first)345346last = s.arr.last()347expected_last = pl.Series(348"a",349[3, 6, None],350dtype=pl.Int64,351)352assert_series_equal(last, expected_last)353354355@pytest.mark.parametrize(356("data", "set", "dtype"),357[358([1, 2], [[1, 2], [3, 4]], pl.Int64),359([True, False], [[True, False], [True, True]], pl.Boolean),360(["a", "b"], [["a", "b"], ["c", "d"]], pl.String),361([b"a", b"b"], [[b"a", b"b"], [b"c", b"d"]], pl.Binary),362(363[{"a": 1}, {"a": 2}],364[[{"a": 1}, {"a": 2}], [{"b": 1}, {"a": 3}]],365pl.Struct([pl.Field("a", pl.Int64)]),366),367],368)369def test_is_in_array(data: list[Any], set: list[list[Any]], dtype: pl.DataType) -> None:370df = pl.DataFrame(371{"a": data, "arr": set},372schema={"a": dtype, "arr": pl.Array(dtype, 2)},373)374out = df.select(is_in=pl.col("a").is_in(pl.col("arr"))).to_series()375expected = pl.Series("is_in", [True, False])376assert_series_equal(out, expected)377378379def test_array_join() -> None:380df = pl.DataFrame(381{382"a": [["ab", "c", "d"], ["e", "f", "g"], [None, None, None], None],383"separator": ["&", None, "*", "_"],384},385schema={386"a": pl.Array(pl.String, 3),387"separator": pl.String,388},389)390out = df.select(pl.col("a").arr.join("-"))391assert out.to_dict(as_series=False) == {"a": ["ab-c-d", "e-f-g", "", None]}392out = df.select(pl.col("a").arr.join(pl.col("separator")))393assert out.to_dict(as_series=False) == {"a": ["ab&c&d", None, "", None]}394395# test ignore_nulls argument396df = pl.DataFrame(397{398"a": [399["a", None, "b", None],400None,401[None, None, None, None],402["c", "d", "e", "f"],403],404"separator": ["-", "&", " ", "@"],405},406schema={407"a": pl.Array(pl.String, 4),408"separator": pl.String,409},410)411# ignore nulls412out = df.select(pl.col("a").arr.join("-", ignore_nulls=True))413assert out.to_dict(as_series=False) == {"a": ["a-b", None, "", "c-d-e-f"]}414out = df.select(pl.col("a").arr.join(pl.col("separator"), ignore_nulls=True))415assert out.to_dict(as_series=False) == {"a": ["a-b", None, "", "c@d@e@f"]}416# propagate nulls417out = df.select(pl.col("a").arr.join("-", ignore_nulls=False))418assert out.to_dict(as_series=False) == {"a": [None, None, None, "c-d-e-f"]}419out = df.select(pl.col("a").arr.join(pl.col("separator"), ignore_nulls=False))420assert out.to_dict(as_series=False) == {"a": [None, None, None, "c@d@e@f"]}421422423def test_array_explode() -> None:424df = pl.DataFrame(425{426"str": [["a", "b"], ["c", None], None],427"nested": [[[1, 2], [3]], [[], [4, None]], None],428"logical": [429[datetime.date(1998, 1, 1), datetime.date(2000, 10, 1)],430[datetime.date(2024, 1, 1), None],431None,432],433},434schema={435"str": pl.Array(pl.String, 2),436"nested": pl.Array(pl.List(pl.Int64), 2),437"logical": pl.Array(pl.Date, 2),438},439)440out = df.select(pl.all().arr.explode())441expected = pl.DataFrame(442{443"str": ["a", "b", "c", None, None],444"nested": [[1, 2], [3], [], [4, None], None],445"logical": [446datetime.date(1998, 1, 1),447datetime.date(2000, 10, 1),448datetime.date(2024, 1, 1),449None,450None,451],452}453)454assert_frame_equal(out, expected)455456# test no-null fast path457s = pl.Series(458[459[datetime.date(1998, 1, 1), datetime.date(1999, 1, 3)],460[datetime.date(2000, 1, 1), datetime.date(2023, 10, 1)],461],462dtype=pl.Array(pl.Date, 2),463)464out_s = s.arr.explode()465expected_s = pl.Series(466[467datetime.date(1998, 1, 1),468datetime.date(1999, 1, 3),469datetime.date(2000, 1, 1),470datetime.date(2023, 10, 1),471],472dtype=pl.Date,473)474assert_series_equal(out_s, expected_s)475476477@pytest.mark.parametrize(478("arr", "data", "expected", "dtype"),479[480([[1, 2], [3, None], None], 1, [1, 0, None], pl.Int64),481([[True, False], [True, None], None], True, [1, 1, None], pl.Boolean),482([["a", "b"], ["c", None], None], "a", [1, 0, None], pl.String),483([[b"a", b"b"], [b"c", None], None], b"a", [1, 0, None], pl.Binary),484],485)486def test_array_count_matches(487arr: list[list[Any] | None], data: Any, expected: list[Any], dtype: pl.DataType488) -> None:489df = pl.DataFrame({"arr": arr}, schema={"arr": pl.Array(dtype, 2)})490out = df.select(count_matches=pl.col("arr").arr.count_matches(data))491assert out.to_dict(as_series=False) == {"count_matches": expected}492493494def test_array_count_matches_wildcard_expansion() -> None:495df = pl.DataFrame(496{"a": [[1, 2]], "b": [[3, 4]]},497schema={"a": pl.Array(pl.Int64, 2), "b": pl.Array(pl.Int64, 2)},498)499assert df.select(pl.all().arr.count_matches(3)).to_dict(as_series=False) == {500"a": [0],501"b": [1],502}503504505def test_array_to_struct() -> None:506df = pl.DataFrame(507{"a": [[1, 2, 3], [4, 5, None]]}, schema={"a": pl.Array(pl.Int8, 3)}508)509assert df.select([pl.col("a").arr.to_struct()]).to_series().to_list() == [510{"field_0": 1, "field_1": 2, "field_2": 3},511{"field_0": 4, "field_1": 5, "field_2": None},512]513514df = pl.DataFrame(515{"a": [[1, 2, None], [1, 2, 3]]}, schema={"a": pl.Array(pl.Int8, 3)}516)517assert df.select(518pl.col("a").arr.to_struct(fields=lambda idx: f"col_name_{idx}")519).to_series().to_list() == [520{"col_name_0": 1, "col_name_1": 2, "col_name_2": None},521{"col_name_0": 1, "col_name_1": 2, "col_name_2": 3},522]523524assert df.lazy().select(pl.col("a").arr.to_struct()).unnest(525"a"526).sum().collect().columns == ["field_0", "field_1", "field_2"]527528529def test_array_shift() -> None:530df = pl.DataFrame(531{"a": [[1, 2, 3], None, [4, 5, 6], [7, 8, 9]], "n": [None, 1, 1, -2]},532schema={"a": pl.Array(pl.Int64, 3), "n": pl.Int64},533)534535out = df.select(536lit=pl.col("a").arr.shift(1), expr=pl.col("a").arr.shift(pl.col("n"))537)538expected = pl.DataFrame(539{540"lit": [[None, 1, 2], None, [None, 4, 5], [None, 7, 8]],541"expr": [None, None, [None, 4, 5], [9, None, None]],542},543schema={"lit": pl.Array(pl.Int64, 3), "expr": pl.Array(pl.Int64, 3)},544)545assert_frame_equal(out, expected)546547548def test_array_n_unique() -> None:549df = pl.DataFrame(550{551"a": [[1, 1, 2], [3, 3, 3], [None, None, None], None],552},553schema={"a": pl.Array(pl.Int64, 3)},554)555556out = df.select(n_unique=pl.col("a").arr.n_unique())557expected = pl.DataFrame(558{"n_unique": [2, 1, 1, None]}, schema={"n_unique": pl.get_index_type()}559)560assert_frame_equal(out, expected)561562563def test_explode_19049() -> None:564df = pl.DataFrame({"a": [[1, 2, 3]]}, schema={"a": pl.Array(pl.Int64, 3)})565result_df = df.select(pl.col.a.arr.explode())566expected_df = pl.DataFrame({"a": [1, 2, 3]}, schema={"a": pl.Int64})567assert_frame_equal(result_df, expected_df)568569df = pl.DataFrame({"a": [1, 2, 3]}, schema={"a": pl.Int64})570with pytest.raises(571InvalidOperationError,572match="expected Array datatype for array operation, got: Int64",573):574df.select(pl.col.a.arr.explode())575576577def test_array_join_unequal_lengths_22018() -> None:578df = pl.DataFrame(579[580pl.Series(581"a",582[583["a", "b", "d"],584["ya", "x", "y"],585["ya", "x", "y"],586],587pl.Array(pl.String, 3),588),589]590)591with pytest.raises(pl.exceptions.ShapeError):592df.select(pl.col.a.arr.join(pl.Series([",", "-"])))593594595def test_array_shift_unequal_lengths_22018() -> None:596with pytest.raises(pl.exceptions.ShapeError):597pl.Series(598"a",599[600["a", "b", "d"],601["a", "b", "d"],602["a", "b", "d"],603],604pl.Array(pl.String, 3),605).arr.shift(pl.Series([1, 2]))606607608def test_array_shift_self_broadcast_22124() -> None:609assert_series_equal(610pl.Series(611"a",612[613["a", "b", "d"],614],615pl.Array(pl.String, 3),616).arr.shift(pl.Series([1, 2])),617pl.Series(618"a",619[620[None, "a", "b"],621[None, None, "a"],622],623pl.Array(pl.String, 3),624),625)626627628def test_arr_contains() -> None:629s = pl.Series([[1, 2, None], [None, None, None], None], dtype=pl.Array(pl.Int64, 3))630631assert_series_equal(632s.arr.contains(None, nulls_equal=False),633pl.Series([None, None, None], dtype=pl.Boolean),634)635assert_series_equal(636s.arr.contains(None, nulls_equal=True),637pl.Series([True, True, None], dtype=pl.Boolean),638)639assert_series_equal(640s.arr.contains(1, nulls_equal=False),641pl.Series([True, False, None], dtype=pl.Boolean),642)643assert_series_equal(644s.arr.contains(1, nulls_equal=True),645pl.Series([True, False, None], dtype=pl.Boolean),646)647648649@pytest.mark.parametrize(650"expr",651[652pl.col("a").arr.contains("z"),653pl.col("a").arr.explode(),654pl.col("a").arr.sum(),655pl.col("a").arr.to_list(),656pl.col("a").arr.to_struct(),657pl.col("a").arr.unique(),658pl.col("a").arr.all(),659pl.col("a").arr.any(),660pl.col("a").arr.arg_max(),661pl.col("a").arr.arg_min(),662pl.col("a").arr.count_matches("z"),663pl.col("a").arr.first(),664pl.col("a").arr.get(0),665pl.col("a").arr.join(""),666pl.col("a").arr.last(),667pl.col("a").arr.len(),668pl.col("a").arr.max(),669pl.col("a").arr.mean(),670pl.col("a").arr.median(),671pl.col("a").arr.min(),672pl.col("a").arr.n_unique(),673pl.col("a").arr.reverse(),674pl.col("a").arr.shift(1),675pl.col("a").arr.sort(),676pl.col("a").arr.std(),677pl.col("a").arr.var(),678],679)680def test_schema_non_array(expr: pl.Expr) -> None:681lf = pl.LazyFrame({"a": ["a", "b", "c"]})682683with pytest.raises(684InvalidOperationError,685match="expected Array datatype for array operation, got: String",686):687lf.select(expr).collect_schema()688689690def test_array_get_broadcast_26217() -> None:691df = pl.DataFrame({"idx": [0, 1, 2, 1, 2, 0, 1]})692out = df.select(pl.lit([42, 13, 37], pl.Array(pl.UInt8, 3)).arr.get(pl.col.idx))693expected = pl.DataFrame(694{"literal": [42, 13, 37, 13, 37, 42, 13]}, schema={"literal": pl.UInt8}695)696assert_frame_equal(out, expected)697698699