Skip to content

gh-58338: Support multi-dimensional slicing in memoryview#153661

Open
serhiy-storchaka wants to merge 1 commit into
python:mainfrom
serhiy-storchaka:memoryview-multidim-slice
Open

gh-58338: Support multi-dimensional slicing in memoryview#153661
serhiy-storchaka wants to merge 1 commit into
python:mainfrom
serhiy-storchaka:memoryview-multidim-slice

Conversation

@serhiy-storchaka

@serhiy-storchaka serhiy-storchaka commented Jul 13, 2026

Copy link
Copy Markdown
Member

Slicing a multi-dimensional memoryview, or indexing it with a combination of integers, slices and an ellipsis, now returns a sub-view instead of raising NotImplementedError. Each integer drops the corresponding dimension, a slice keeps it, and the ellipsis expands to full slices over the remaining dimensions. An empty tuple or a bare ellipsis selects the whole view.

Such sub-views also support slice assignment, with the same shape and format matching rules as one-dimensional assignment (the right-hand side must be a bytes-like object of the matching shape; a one-dimensional sub-view accepts any matching bytes-like object).

>>> m = memoryview(bytearray(range(12))).cast('B', shape=[3, 4])
>>> m[1].tolist()          # partial index: a row sub-view
[4, 5, 6, 7]
>>> m[1:3, 1:3].tolist()   # rectangular sub-view
[[5, 6], [9, 10]]
>>> m[..., 1].tolist()     # ellipsis fills the leading dimensions
[1, 5, 9]
>>> m[1:3, 1:3] = memoryview(bytes([10, 11, 12, 13])).cast('B', shape=[2, 2])
>>> m.tolist()
[[0, 1, 2, 3], [4, 10, 11, 7], [8, 12, 13, 11]]

Buffers with suboffsets (indirect, PIL-style) are not yet handled on the sub-view paths and still raise NotImplementedError; a full index (which follows the suboffsets) and a leading-dimension slice continue to work.

Slicing a multi-dimensional memoryview, or indexing it with a
combination of integers, slices and an ellipsis, now returns a sub-view
instead of raising NotImplementedError.  Each integer drops the
corresponding dimension, a slice keeps it, and the ellipsis expands to
full slices over the remaining dimensions.  Such sub-views also support
slice assignment, with the same shape and format matching rules as
one-dimensional assignment.

Buffers with suboffsets (indirect, PIL-style) are not yet handled on the
sub-view paths and still raise NotImplementedError.
@read-the-docs-community

Copy link
Copy Markdown

Documentation build overview

📚 cpython-previews | 🛠️ Build #33563220 | 📁 Comparing 6f4d247 against main (1fece44)

  🔍 Preview build  

3 files changed
± library/stdtypes.html
± whatsnew/3.16.html
± whatsnew/changelog.html

@serhiy-storchaka serhiy-storchaka requested a review from pitrou July 13, 2026 12:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant