Skip to content

panic in as_array_mut #527

@alexander-kjall-hafslundeco

Description

Hi

When trying to create an PyArray2 we stumbled upon a panic. The following code reproduces it:

src/main.rs:

use numpy::PyArray2;
use pyo3::PyResult;
use numpy::PyArrayMethods;
use pyo3::Python;

fn main() {
    let _ = Python::attach(|py| -> PyResult<()> {
        let array = PyArray2::<f64>::zeros(py, [2, 0], false);
        let mut array_rw = array.readwrite();
        let _array_rw = array_rw.as_array_mut();
        Ok(())
    });
}

Cargo.toml:

[package]
name = "numpy-repro"
version = "0.1.0"
edition = "2024"

[dependencies]
pyo3 = { version = "0.27", features = ["auto-initialize"] }
numpy = "0.27"

Backtrace:

thread 'main' (15879273) panicked at /Users/alexander.kjall/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/ndarray-0.17.2/src/impl_raw_views.rs:297:17:
The strides must not allow any element to be referenced by two different indices
stack backtrace:
   0: __rustc::rust_begin_unwind
             at /rustc/86a49fd71fecd25b0fd20247db0ba95eeceaba28/library/std/src/panicking.rs:689:5
   1: core::panicking::panic_fmt
             at /rustc/86a49fd71fecd25b0fd20247db0ba95eeceaba28/library/core/src/panicking.rs:80:14
   2: <ndarray::ArrayBase<ndarray::RawViewRepr<*mut f64>, ndarray::dimension::dim::Dim<[usize; 2]>, f64>>::from_shape_ptr::<ndarray::shape_builder::StrideShape<ndarray::dimension::dim::Dim<[usize; 2]>>>
             at /Users/alexander.kjall/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/ndarray-0.17.2/src/impl_raw_views.rs:297:17
   3: <ndarray::ArrayBase<ndarray::ViewRepr<&mut f64>, ndarray::dimension::dim::Dim<[usize; 2]>, f64>>::from_shape_ptr::<ndarray::shape_builder::StrideShape<ndarray::dimension::dim::Dim<[usize; 2]>>>
             at /Users/alexander.kjall/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/ndarray-0.17.2/src/impl_views/constructors.rs:220:9
   4: <pyo3::instance::Bound<numpy::array::PyArray<f64, ndarray::dimension::dim::Dim<[usize; 2]>>> as numpy::array::PyArrayMethods<f64, ndarray::dimension::dim::Dim<[usize; 2]>>>::as_array_mut::{closure#0}
             at /Users/alexander.kjall/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/numpy-0.27.1/src/array.rs:1499:36
   5: numpy::array::as_view::<f64, ndarray::dimension::dim::Dim<[usize; 2]>, ndarray::ViewRepr<&mut f64>, <pyo3::instance::Bound<numpy::array::PyArray<f64, ndarray::dimension::dim::Dim<[usize; 2]>>> as numpy::array::PyArrayMethods<f64, ndarray::dimension::dim::Dim<[usize; 2]>>>::as_array_mut::{closure#0}>
             at /Users/alexander.kjall/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/numpy-0.27.1/src/array.rs:1346:21
   6: <pyo3::instance::Bound<numpy::array::PyArray<f64, ndarray::dimension::dim::Dim<[usize; 2]>>> as numpy::array::PyArrayMethods<f64, ndarray::dimension::dim::Dim<[usize; 2]>>>::as_array_mut
             at /Users/alexander.kjall/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/numpy-0.27.1/src/array.rs:1499:9
   7: <numpy::borrow::PyReadwriteArray<f64, ndarray::dimension::dim::Dim<[usize; 2]>>>::as_array_mut
             at /Users/alexander.kjall/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/numpy-0.27.1/src/borrow/mod.rs:509:29
   8: numpy_repro::main::{closure#0}
             at ./src/main.rs:10:34
   9: <pyo3::marker::Python>::attach::<numpy_repro::main::{closure#0}, core::result::Result<(), pyo3::err::PyErr>>
             at /Users/alexander.kjall/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/pyo3-0.27.2/src/marker.rs:426:9
  10: numpy_repro::main
             at ./src/main.rs:7:13
  11: <fn() as core::ops::function::FnOnce<()>>::call_once
             at /rustc/86a49fd71fecd25b0fd20247db0ba95eeceaba28/library/core/src/ops/function.rs:250:5
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.

Running with python 3.14.

It would be simpler to expose this error to the python layer if as_array_mut() returned a Result instead of panicking on invalid input :)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions