@@ -952,18 +952,8 @@ impl<T: Element> PyArray<T, Ix1> {
952
952
/// });
953
953
/// ```
954
954
pub fn from_slice < ' py > ( py : Python < ' py > , slice : & [ T ] ) -> & ' py Self {
955
- unsafe {
956
- let array = PyArray :: new ( py, [ slice. len ( ) ] , false ) ;
957
- if T :: IS_COPY {
958
- ptr:: copy_nonoverlapping ( slice. as_ptr ( ) , array. data ( ) , slice. len ( ) ) ;
959
- } else {
960
- let data_ptr = array. data ( ) ;
961
- for ( i, item) in slice. iter ( ) . enumerate ( ) {
962
- data_ptr. add ( i) . write ( item. clone ( ) ) ;
963
- }
964
- }
965
- array
966
- }
955
+ let data = slice. to_vec ( ) ;
956
+ data. into_pyarray ( py)
967
957
}
968
958
969
959
/// Construct one-dimension PyArray
@@ -996,20 +986,8 @@ impl<T: Element> PyArray<T, Ix1> {
996
986
/// });
997
987
/// ```
998
988
pub fn from_exact_iter ( py : Python < ' _ > , iter : impl ExactSizeIterator < Item = T > ) -> & Self {
999
- // NumPy will always zero-initialize object pointers,
1000
- // so the array can be dropped safely if the iterator panics.
1001
- unsafe {
1002
- let len = iter. len ( ) ;
1003
- let array = Self :: new ( py, [ len] , false ) ;
1004
- let mut idx = 0 ;
1005
- for item in iter {
1006
- assert ! ( idx < len) ;
1007
- array. uget_raw ( [ idx] ) . write ( item) ;
1008
- idx += 1 ;
1009
- }
1010
- assert ! ( idx == len) ;
1011
- array
1012
- }
989
+ let data = iter. collect :: < Box < [ _ ] > > ( ) ;
990
+ data. into_pyarray ( py)
1013
991
}
1014
992
1015
993
/// Construct one-dimension PyArray from a type which implements
@@ -1028,29 +1006,8 @@ impl<T: Element> PyArray<T, Ix1> {
1028
1006
/// });
1029
1007
/// ```
1030
1008
pub fn from_iter ( py : Python < ' _ > , iter : impl IntoIterator < Item = T > ) -> & Self {
1031
- let iter = iter. into_iter ( ) ;
1032
- let ( min_len, max_len) = iter. size_hint ( ) ;
1033
- let mut capacity = max_len. unwrap_or_else ( || min_len. max ( 512 / mem:: size_of :: < T > ( ) ) ) ;
1034
- unsafe {
1035
- // NumPy will always zero-initialize object pointers,
1036
- // so the array can be dropped safely if the iterator panics.
1037
- let array = Self :: new ( py, [ capacity] , false ) ;
1038
- let mut length = 0 ;
1039
- for ( i, item) in iter. enumerate ( ) {
1040
- length += 1 ;
1041
- if length > capacity {
1042
- capacity *= 2 ;
1043
- array
1044
- . resize ( capacity)
1045
- . expect ( "PyArray::from_iter: Failed to allocate memory" ) ;
1046
- }
1047
- array. uget_raw ( [ i] ) . write ( item) ;
1048
- }
1049
- if capacity > length {
1050
- array. resize ( length) . unwrap ( )
1051
- }
1052
- array
1053
- }
1009
+ let data = iter. into_iter ( ) . collect :: < Vec < _ > > ( ) ;
1010
+ data. into_pyarray ( py)
1054
1011
}
1055
1012
1056
1013
/// Extends or trancates the length of 1 dimension PyArray.
@@ -1335,8 +1292,6 @@ impl<T: Element + AsPrimitive<f64>> PyArray<T, Ix1> {
1335
1292
mod tests {
1336
1293
use super :: * ;
1337
1294
1338
- use std:: ops:: Range ;
1339
-
1340
1295
#[ test]
1341
1296
fn test_get_unchecked ( ) {
1342
1297
pyo3:: Python :: with_gil ( |py| {
@@ -1366,36 +1321,4 @@ mod tests {
1366
1321
py_run ! ( py, arr, "assert arr.dtype.hasobject" ) ;
1367
1322
} ) ;
1368
1323
}
1369
-
1370
- struct InsincereIterator ( Range < usize > , usize ) ;
1371
-
1372
- impl Iterator for InsincereIterator {
1373
- type Item = usize ;
1374
-
1375
- fn next ( & mut self ) -> Option < Self :: Item > {
1376
- self . 0 . next ( )
1377
- }
1378
- }
1379
-
1380
- impl ExactSizeIterator for InsincereIterator {
1381
- fn len ( & self ) -> usize {
1382
- self . 1
1383
- }
1384
- }
1385
-
1386
- #[ test]
1387
- #[ should_panic]
1388
- fn from_exact_iter_too_short ( ) {
1389
- Python :: with_gil ( |py| {
1390
- PyArray :: from_exact_iter ( py, InsincereIterator ( 0 ..3 , 5 ) ) ;
1391
- } ) ;
1392
- }
1393
-
1394
- #[ test]
1395
- #[ should_panic]
1396
- fn from_exact_iter_too_long ( ) {
1397
- Python :: with_gil ( |py| {
1398
- PyArray :: from_exact_iter ( py, InsincereIterator ( 0 ..5 , 3 ) ) ;
1399
- } ) ;
1400
- }
1401
1324
}
0 commit comments