MCPcopy Create free account
hub / github.com/PyO3/rust-numpy / try_as_matrix_shape_strides

Function try_as_matrix_shape_strides

src/array.rs:1421–1476  ·  view source on GitHub ↗
(
    slf: &Bound<'_, PyArray<N, D>>,
)

Source from the content-addressed store, hash-verified

1419
1420#[cfg(feature = "nalgebra")]
1421fn try_as_matrix_shape_strides<N, D, R, C, RStride, CStride>(
1422 slf: &Bound<'_, PyArray<N, D>>,
1423) -> Option<((R, C), (RStride, CStride))>
1424where
1425 N: nalgebra::Scalar + Element,
1426 D: Dimension,
1427 R: nalgebra::Dim,
1428 C: nalgebra::Dim,
1429 RStride: nalgebra::Dim,
1430 CStride: nalgebra::Dim,
1431{
1432 let ndim = slf.ndim();
1433 let shape = slf.shape();
1434 let strides = slf.strides();
1435
1436 if ndim != 1 && ndim != 2 {
1437 return None;
1438 }
1439
1440 if strides.iter().any(|strides| *strides < 0) {
1441 return None;
1442 }
1443
1444 let rows = shape[0];
1445 let cols = *shape.get(1).unwrap_or(&1);
1446
1447 if R::try_to_usize().map(|expected| rows == expected) == Some(false) {
1448 return None;
1449 }
1450
1451 if C::try_to_usize().map(|expected| cols == expected) == Some(false) {
1452 return None;
1453 }
1454
1455 let row_stride = strides[0] as usize / mem::size_of::<N>();
1456 let col_stride = strides
1457 .get(1)
1458 .map_or(rows, |stride| *stride as usize / mem::size_of::<N>());
1459
1460 if RStride::try_to_usize().map(|expected| row_stride == expected) == Some(false) {
1461 return None;
1462 }
1463
1464 if CStride::try_to_usize().map(|expected| col_stride == expected) == Some(false) {
1465 return None;
1466 }
1467
1468 let shape = (R::from_usize(rows), C::from_usize(cols));
1469
1470 let strides = (
1471 RStride::from_usize(row_stride),
1472 CStride::from_usize(col_stride),
1473 );
1474
1475 Some((shape, strides))
1476}
1477
1478impl<'py, T, D> PyArrayMethods<'py, T, D> for Bound<'py, PyArray<T, D>> {

Callers 2

try_as_matrixMethod · 0.85
try_as_matrix_mutMethod · 0.85

Calls 4

stridesMethod · 0.80
ndimMethod · 0.45
shapeMethod · 0.45
getMethod · 0.45

Tested by

no test coverage detected