1
1
//! Safe interface for NumPy ndarray
2
2
3
3
use ndarray:: * ;
4
- use npyffi;
4
+ use npyffi:: { self , PyArrayAPI } ;
5
5
use pyo3:: * ;
6
6
use std:: marker:: PhantomData ;
7
7
use std:: os:: raw:: c_void;
@@ -15,7 +15,7 @@ pub struct PyArray<T>(PyObject, PhantomData<T>);
15
15
16
16
pyobject_native_type_convert ! (
17
17
PyArray <T >,
18
- * npyffi:: PyArray_Type_Ptr ,
18
+ * npyffi:: PyArrayAPI . get_type_object ( npyffi :: ArrayType :: PyArray_Type ) ,
19
19
npyffi:: PyArray_Check ,
20
20
T
21
21
) ;
@@ -162,8 +162,8 @@ impl<T: TypeNum> PyArray<T> {
162
162
/// assert_eq!(pyarray.as_slice().unwrap(), &[1, 2, 3, 4, 5]);
163
163
/// # }
164
164
/// ```
165
- pub fn from_boxed_slice ( py : Python , np : & PyArrayModule , v : Box < [ T ] > ) -> PyArray < T > {
166
- IntoPyArray :: into_pyarray ( v, py, np )
165
+ pub fn from_boxed_slice ( py : Python , v : Box < [ T ] > ) -> PyArray < T > {
166
+ IntoPyArray :: into_pyarray ( v, py)
167
167
}
168
168
169
169
/// Construct one-dimension PyArray from `impl IntoIterator`.
@@ -180,8 +180,8 @@ impl<T: TypeNum> PyArray<T> {
180
180
/// assert_eq!(pyarray.as_slice().unwrap(), &[1, 2, 3, 4, 5]);
181
181
/// # }
182
182
/// ```
183
- pub fn from_iter ( py : Python , np : & PyArrayModule , i : impl IntoIterator < Item = T > ) -> PyArray < T > {
184
- i. into_iter ( ) . collect :: < Vec < _ > > ( ) . into_pyarray ( py, np )
183
+ pub fn from_iter ( py : Python , i : impl IntoIterator < Item = T > ) -> PyArray < T > {
184
+ i. into_iter ( ) . collect :: < Vec < _ > > ( ) . into_pyarray ( py)
185
185
}
186
186
187
187
/// Construct one-dimension PyArray from Vec.
@@ -196,8 +196,8 @@ impl<T: TypeNum> PyArray<T> {
196
196
/// assert_eq!(pyarray.as_slice().unwrap(), &[1, 2, 3, 4, 5]);
197
197
/// # }
198
198
/// ```
199
- pub fn from_vec ( py : Python , np : & PyArrayModule , v : Vec < T > ) -> PyArray < T > {
200
- IntoPyArray :: into_pyarray ( v, py, np )
199
+ pub fn from_vec ( py : Python , v : Vec < T > ) -> PyArray < T > {
200
+ IntoPyArray :: into_pyarray ( v, py)
201
201
}
202
202
203
203
/// Construct a two-dimension PyArray from `Vec<Vec<T>>`.
@@ -217,11 +217,7 @@ impl<T: TypeNum> PyArray<T> {
217
217
/// assert!(PyArray::from_vec2(gil.python(), &np, &vec![vec![1], vec![2, 3]]).is_err());
218
218
/// # }
219
219
/// ```
220
- pub fn from_vec2 (
221
- py : Python ,
222
- np : & PyArrayModule ,
223
- v : & Vec < Vec < T > > ,
224
- ) -> Result < PyArray < T > , ArrayCastError > {
220
+ pub fn from_vec2 ( py : Python , v : & Vec < Vec < T > > ) -> Result < PyArray < T > , ArrayCastError > {
225
221
let last_len = v. last ( ) . map_or ( 0 , |v| v. len ( ) ) ;
226
222
if v. iter ( ) . any ( |v| v. len ( ) != last_len) {
227
223
return Err ( ArrayCastError :: FromVec ) ;
@@ -230,7 +226,7 @@ impl<T: TypeNum> PyArray<T> {
230
226
let flattend: Vec < _ > = v. iter ( ) . cloned ( ) . flatten ( ) . collect ( ) ;
231
227
unsafe {
232
228
let data = convert:: into_raw ( flattend) ;
233
- Ok ( PyArray :: new_ ( py, np , & dims, null_mut ( ) , data) )
229
+ Ok ( PyArray :: new_ ( py, & dims, null_mut ( ) , data) )
234
230
}
235
231
}
236
232
@@ -254,11 +250,7 @@ impl<T: TypeNum> PyArray<T> {
254
250
/// assert!(PyArray::from_vec3(gil.python(), &np, &vec![vec![vec![1], vec![]]]).is_err());
255
251
/// # }
256
252
/// ```
257
- pub fn from_vec3 (
258
- py : Python ,
259
- np : & PyArrayModule ,
260
- v : & Vec < Vec < Vec < T > > > ,
261
- ) -> Result < PyArray < T > , ArrayCastError > {
253
+ pub fn from_vec3 ( py : Python , v : & Vec < Vec < Vec < T > > > ) -> Result < PyArray < T > , ArrayCastError > {
262
254
let dim2 = v. last ( ) . map_or ( 0 , |v| v. len ( ) ) ;
263
255
if v. iter ( ) . any ( |v| v. len ( ) != dim2) {
264
256
return Err ( ArrayCastError :: FromVec ) ;
@@ -271,7 +263,7 @@ impl<T: TypeNum> PyArray<T> {
271
263
let flattend: Vec < _ > = v. iter ( ) . flat_map ( |v| v. iter ( ) . cloned ( ) . flatten ( ) ) . collect ( ) ;
272
264
unsafe {
273
265
let data = convert:: into_raw ( flattend) ;
274
- Ok ( PyArray :: new_ ( py, np , & dims, null_mut ( ) , data) )
266
+ Ok ( PyArray :: new_ ( py, & dims, null_mut ( ) , data) )
275
267
}
276
268
}
277
269
@@ -287,11 +279,11 @@ impl<T: TypeNum> PyArray<T> {
287
279
/// assert_eq!(pyarray.as_array().unwrap(), array![[1, 2], [3, 4]].into_dyn());
288
280
/// # }
289
281
/// ```
290
- pub fn from_ndarray < D > ( py : Python , np : & PyArrayModule , arr : Array < T , D > ) -> PyArray < T >
282
+ pub fn from_ndarray < D > ( py : Python , arr : Array < T , D > ) -> PyArray < T >
291
283
where
292
284
D : Dimension ,
293
285
{
294
- IntoPyArray :: into_pyarray ( arr, py, np )
286
+ IntoPyArray :: into_pyarray ( arr, py)
295
287
}
296
288
297
289
/// Returns the pointer to the first element of the inner array.
@@ -366,14 +358,13 @@ impl<T: TypeNum> PyArray<T> {
366
358
/// Please use `new` or from methods instead.
367
359
pub unsafe fn new_ (
368
360
py : Python ,
369
- np : & PyArrayModule ,
370
361
dims : & [ usize ] ,
371
362
strides : * mut npy_intp ,
372
363
data : * mut c_void ,
373
364
) -> Self {
374
365
let dims: Vec < _ > = dims. iter ( ) . map ( |d| * d as npy_intp ) . collect ( ) ;
375
- let ptr = np . PyArray_New (
376
- np . get_type_object ( npyffi:: ArrayType :: PyArray_Type ) ,
366
+ let ptr = PyArrayAPI . PyArray_New (
367
+ PyArrayAPI . get_type_object ( npyffi:: ArrayType :: PyArray_Type ) ,
377
368
dims. len ( ) as i32 ,
378
369
dims. as_ptr ( ) as * mut npy_intp ,
379
370
T :: typenum_default ( ) ,
@@ -400,8 +391,8 @@ impl<T: TypeNum> PyArray<T> {
400
391
/// assert_eq!(pyarray.shape(), &[4, 5, 6]);
401
392
/// # }
402
393
/// ```
403
- pub fn new ( py : Python , np : & PyArrayModule , dims : & [ usize ] ) -> Self {
404
- unsafe { Self :: new_ ( py, np , dims, null_mut ( ) , null_mut ( ) ) }
394
+ pub fn new ( py : Python , dims : & [ usize ] ) -> Self {
395
+ unsafe { Self :: new_ ( py, dims, null_mut ( ) , null_mut ( ) ) }
405
396
}
406
397
407
398
/// Construct a new nd-dimensional array filled with 0. If `is_fortran` is true, then
@@ -419,11 +410,11 @@ impl<T: TypeNum> PyArray<T> {
419
410
/// assert_eq!(pyarray.as_array().unwrap(), array![[0, 0], [0, 0]].into_dyn());
420
411
/// # }
421
412
/// ```
422
- pub fn zeros ( py : Python , np : & PyArrayModule , dims : & [ usize ] , is_fortran : bool ) -> Self {
413
+ pub fn zeros ( py : Python , dims : & [ usize ] , is_fortran : bool ) -> Self {
423
414
let dims: Vec < npy_intp > = dims. iter ( ) . map ( |d| * d as npy_intp ) . collect ( ) ;
424
415
unsafe {
425
- let descr = np . PyArray_DescrFromType ( T :: typenum_default ( ) ) ;
426
- let ptr = np . PyArray_Zeros (
416
+ let descr = PyArrayAPI . PyArray_DescrFromType ( T :: typenum_default ( ) ) ;
417
+ let ptr = PyArrayAPI . PyArray_Zeros (
427
418
dims. len ( ) as i32 ,
428
419
dims. as_ptr ( ) as * mut npy_intp ,
429
420
descr,
@@ -449,9 +440,9 @@ impl<T: TypeNum> PyArray<T> {
449
440
/// let pyarray = PyArray::<i32>::arange(gil.python(), &np, -2.0, 4.0, 3.0);
450
441
/// assert_eq!(pyarray.as_slice().unwrap(), &[-2, 1]);
451
442
/// # }
452
- pub fn arange ( py : Python , np : & PyArrayModule , start : f64 , stop : f64 , step : f64 ) -> Self {
443
+ pub fn arange ( py : Python , start : f64 , stop : f64 , step : f64 ) -> Self {
453
444
unsafe {
454
- let ptr = np . PyArray_Arange ( start, stop, step, T :: typenum_default ( ) ) ;
445
+ let ptr = PyArrayAPI . PyArray_Arange ( start, stop, step, T :: typenum_default ( ) ) ;
455
446
Self :: from_owned_ptr ( py, ptr)
456
447
}
457
448
}
@@ -468,44 +459,10 @@ impl<T: TypeNum> PyArray<T> {
468
459
/// assert!(pyarray_f.copy_to(&np, &mut pyarray_i).is_ok());
469
460
/// assert_eq!(pyarray_i.as_slice().unwrap(), &[2, 3, 4]);
470
461
/// # }
471
- pub fn copy_to < U : TypeNum > (
472
- & self ,
473
- np : & PyArrayModule ,
474
- other : & mut PyArray < U > ,
475
- ) -> Result < ( ) , ArrayCastError > {
462
+ pub fn copy_to < U : TypeNum > ( & self , other : & mut PyArray < U > ) -> Result < ( ) , ArrayCastError > {
476
463
let self_ptr = self . as_array_ptr ( ) ;
477
464
let other_ptr = other. as_array_ptr ( ) ;
478
- let result = unsafe { np. PyArray_CopyInto ( other_ptr, self_ptr) } ;
479
- if result == -1 {
480
- Err ( ArrayCastError :: Numpy {
481
- from : T :: npy_data_type ( ) ,
482
- to : U :: npy_data_type ( ) ,
483
- } )
484
- } else {
485
- Ok ( ( ) )
486
- }
487
- }
488
-
489
- /// Move the data of self into `other`, performing a data-type conversion if necessary.
490
- /// # Example
491
- /// ```
492
- /// # extern crate pyo3; extern crate numpy; fn main() {
493
- /// use numpy::{PyArray, PyArrayModule, IntoPyArray};
494
- /// let gil = pyo3::Python::acquire_gil();
495
- /// let np = PyArrayModule::import(gil.python()).unwrap();
496
- /// let pyarray_f = PyArray::<f64>::arange(gil.python(), &np, 2.0, 5.0, 1.0);
497
- /// let mut pyarray_i = PyArray::<i64>::new(gil.python(), &np, &[3]);
498
- /// assert!(pyarray_f.move_to(&np, &mut pyarray_i).is_ok());
499
- /// assert_eq!(pyarray_i.as_slice().unwrap(), &[2, 3, 4]);
500
- /// # }
501
- pub fn move_to < U : TypeNum > (
502
- self ,
503
- np : & PyArrayModule ,
504
- other : & mut PyArray < U > ,
505
- ) -> Result < ( ) , ArrayCastError > {
506
- let self_ptr = self . as_array_ptr ( ) ;
507
- let other_ptr = other. as_array_ptr ( ) ;
508
- let result = unsafe { np. PyArray_MoveInto ( other_ptr, self_ptr) } ;
465
+ let result = unsafe { PyArrayAPI . PyArray_CopyInto ( other_ptr, self_ptr) } ;
509
466
if result == -1 {
510
467
Err ( ArrayCastError :: Numpy {
511
468
from : T :: npy_data_type ( ) ,
@@ -530,12 +487,15 @@ impl<T: TypeNum> PyArray<T> {
530
487
pub fn cast < U : TypeNum > (
531
488
& self ,
532
489
py : Python ,
533
- np : & PyArrayModule ,
534
490
is_fortran : bool ,
535
491
) -> Result < PyArray < U > , ArrayCastError > {
536
492
let ptr = unsafe {
537
- let descr = np. PyArray_DescrFromType ( U :: typenum_default ( ) ) ;
538
- np. PyArray_CastToType ( self . as_array_ptr ( ) , descr, if is_fortran { -1 } else { 0 } )
493
+ let descr = PyArrayAPI . PyArray_DescrFromType ( U :: typenum_default ( ) ) ;
494
+ PyArrayAPI . PyArray_CastToType (
495
+ self . as_array_ptr ( ) ,
496
+ descr,
497
+ if is_fortran { -1 } else { 0 } ,
498
+ )
539
499
} ;
540
500
if ptr. is_null ( ) {
541
501
Err ( ArrayCastError :: Numpy {
0 commit comments