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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions