You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
[Python] .slice methods should accept Arrow scalar types #51145
The .slice methods take two integers as arguments, but cannot take arrow integer types.
importpyarrowaspaa=pa.array([0, 1, 2, 3, 4, 5])
a.slice(0, 4)
# <pyarrow.lib.Int64Array object at 0x798d8fec2ce0># [# 1,# 2,# 3,# 4# ]a.slice(a[0], a[4])
# ---------------------------------------------------------------------------# TypeError Traceback (most recent call last)# Cell In[12], line 1# ----> 1 a.slice(a[0], a[4])## File pyarrow/array.pxi:1639, in pyarrow.lib.Array.slice()# -> 1639 'Could not get source, probably due dynamically evaluated source code.'## TypeError: '<' not supported between instances of 'pyarrow.lib.Int64Scalar' and 'int'
The same is true for tables:
t=pa.Table.from_pydict({"a": a})
t.slice(a[0], a[4])
# ---------------------------------------------------------------------------# TypeError Traceback (most recent call last)# Cell In[13], line 1# ----> 1 t.slice(a[0], a[4])# File pyarrow/table.pxi:4299, in pyarrow.lib.Table.slice()# -> 4299 'Could not get source, probably due dynamically evaluated source code.'# TypeError: '<' not supported between instances of 'pyarrow.lib.Int64Scalar' and 'int'
This is not generally true of other methods. For example, .take is fine with getting an arrow array. I can even do a[slice(a[0], a[0] + a[4])], where that slice contains pyarrow scalars.
I think it is kinda silly that if I have offsets for an arrow table in another arrow table I am having to convert those offsets to python integers (e.g. t.slice(a[0].as_py(), a[4].as_py())) or converting to indexing with a slice object.
Thanks for the issue @ivirshup
The difference between .take and .slice is that they take two different code paths. .take goes through the compute module code path, where _pack_compute_args does the type mapping, then C++ compute functions are all called with arrow::Datum arguments. Whereas the .slice code path goes to the C++ Array::Slice which expects int64_t offset and int64_t length.
I agree, .slice behavior could be improved on the Python side. Will look at the PR now.
Activity
[-][python] `.slice` methods should accept Arrow scalar types[/-][+][Python][python] `.slice` methods should accept Arrow scalar types[/+][-][Python][python] `.slice` methods should accept Arrow scalar types[/-][+][Python] `.slice` methods should accept Arrow scalar types[/+]YusefSyed commentedon Sep 4, 2026
take
AlenkaF commentedon Sep 10, 2026
Thanks for the issue @ivirshup
The difference between
.takeand.sliceis that they take two different code paths..takegoes through the compute module code path, where_pack_compute_argsdoes the type mapping, then C++ compute functions are all called witharrow::Datumarguments. Whereas the.slicecode path goes to the C++Array::Slicewhich expectsint64_t offsetandint64_t length.I agree,
.slicebehavior could be improved on the Python side. Will look at the PR now.apacheGH-51145: [Python] Document Arrow scalar slice parameters
GH-51145: [Python] Accept Arrow integer scalars in slice methods (#51160
AlenkaF commentedon Sep 25, 2026
Issue resolved by pull request 51160
#51160