@@ -264,6 +264,15 @@ impl<T, D> PyArray<T, D> {
264
264
pub ( crate ) unsafe fn copy_ptr ( & self , other : * const T , len : usize ) {
265
265
ptr:: copy_nonoverlapping ( other, self . data ( ) , len)
266
266
}
267
+
268
+ fn strides_usize ( & self ) -> & [ usize ] {
269
+ let n = self . ndim ( ) ;
270
+ let ptr = self . as_array_ptr ( ) ;
271
+ unsafe {
272
+ let p = ( * ptr) . strides ;
273
+ :: std:: slice:: from_raw_parts ( p as * const _ , n)
274
+ }
275
+ }
267
276
}
268
277
269
278
impl < T : TypeNum , D : Dimension > PyArray < T , D > {
@@ -276,11 +285,9 @@ impl<T: TypeNum, D: Dimension> PyArray<T, D> {
276
285
fn ndarray_shape ( & self ) -> StrideShape < D > {
277
286
let shape: Shape < _ > = Dim ( self . dims ( ) ) . into ( ) ;
278
287
let size = mem:: size_of :: < T > ( ) ;
279
- let st = D :: from_dimension ( & Dim (
280
- self . strides ( ) . iter ( )
281
- . map ( |& s| s as usize / size)
282
- . collect :: < Vec < _ > > ( )
283
- ) ) . unwrap ( ) ;
288
+ let mut st = D :: from_dimension ( & Dim ( self . strides_usize ( ) ) )
289
+ . expect ( "PyArray::ndarray_shape: dimension mismatching" ) ;
290
+ st. slice_mut ( ) . iter_mut ( ) . for_each ( |e| * e /= size) ;
284
291
shape. strides ( st)
285
292
}
286
293
@@ -1001,6 +1008,6 @@ fn test_get_unchecked() {
1001
1008
#[ test]
1002
1009
fn test_dyn_to_owned_array ( ) {
1003
1010
let gil = pyo3:: Python :: acquire_gil ( ) ;
1004
- let array = PyArray :: from_vec2 ( gil. python ( ) , & vec ! [ vec![ 1 , 2 ] , vec![ 3 , 4 ] ] ) . unwrap ( ) ;
1011
+ let array = PyArray :: from_vec2 ( gil. python ( ) , & vec ! [ vec![ 1 , 2 ] , vec![ 3 , 4 ] ] ) . unwrap ( ) ;
1005
1012
array. into_dyn ( ) . to_owned_array ( ) ;
1006
1013
}
0 commit comments