Skip to content

Commit e331bef

Browse files
authored
Merge pull request #155 from PyO3/npyiter-mentoring
Complete Iterator API
2 parents bacb424 + 64c43a7 commit e331bef

File tree

6 files changed

+755
-1
lines changed

6 files changed

+755
-1
lines changed

src/array.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ impl<T, D> PyArray<T, D> {
175175
/// use pyo3::types::IntoPyDict;
176176
/// let gil = pyo3::Python::acquire_gil();
177177
/// let py = gil.python();
178-
/// let array = numpy::PyArray::arange(py, 0, 1, 10);
178+
/// let array = numpy::PyArray::arange(py, 0, 10, 1);
179179
/// assert!(array.is_contiguous());
180180
/// let locals = [("np", numpy::get_array_module(py).unwrap())].into_py_dict(py);
181181
/// let not_contiguous: &numpy::PyArray1<f32> = py
@@ -773,6 +773,14 @@ impl<T: Element> PyArray<T, Ix1> {
773773
self.resize_([new_elems], 1, NPY_ORDER::NPY_ANYORDER)
774774
}
775775

776+
/// Iterates all elements of this array.
777+
/// See [NpySingleIter](../npyiter/struct.NpySingleIter.html) for more.
778+
pub fn iter<'py>(
779+
&'py self,
780+
) -> PyResult<crate::NpySingleIter<'py, T, crate::npyiter::ReadWrite>> {
781+
crate::NpySingleIterBuilder::readwrite(self).build()
782+
}
783+
776784
fn resize_<D: IntoDimension>(
777785
&self,
778786
dims: D,

src/lib.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ pub mod array;
4040
pub mod convert;
4141
mod error;
4242
pub mod npyffi;
43+
pub mod npyiter;
4344
mod readonly;
4445
mod slice_box;
4546
mod types;
@@ -51,6 +52,9 @@ pub use crate::array::{
5152
pub use crate::convert::{IntoPyArray, NpyIndex, ToNpyDims, ToPyArray};
5253
pub use crate::error::{FromVecError, NotContiguousError, ShapeError};
5354
pub use crate::npyffi::{PY_ARRAY_API, PY_UFUNC_API};
55+
pub use crate::npyiter::{
56+
IterMode, NpyIterFlag, NpyMultiIter, NpyMultiIterBuilder, NpySingleIter, NpySingleIterBuilder,
57+
};
5458
pub use crate::readonly::{
5559
PyReadonlyArray, PyReadonlyArray1, PyReadonlyArray2, PyReadonlyArray3, PyReadonlyArray4,
5660
PyReadonlyArray5, PyReadonlyArray6, PyReadonlyArrayDyn,

src/npyffi/flags.rs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use super::npy_uint32;
12
use std::os::raw::c_int;
23

34
pub const NPY_ARRAY_C_CONTIGUOUS: c_int = 0x0001;
@@ -28,3 +29,36 @@ pub const NPY_ARRAY_OUT_FARRAY: c_int = NPY_ARRAY_FARRAY;
2829
pub const NPY_ARRAY_INOUT_FARRAY: c_int = NPY_ARRAY_FARRAY | NPY_ARRAY_UPDATEIFCOPY;
2930
pub const NPY_ARRAY_INOUT_FARRAY2: c_int = NPY_ARRAY_FARRAY | NPY_ARRAY_WRITEBACKIFCOPY;
3031
pub const NPY_ARRAY_UPDATE_ALL: c_int = NPY_ARRAY_C_CONTIGUOUS | NPY_ARRAY_F_CONTIGUOUS;
32+
33+
pub const NPY_ITER_C_INDEX: npy_uint32 = 0x00000001;
34+
pub const NPY_ITER_F_INDEX: npy_uint32 = 0x00000002;
35+
pub const NPY_ITER_MULTI_INDEX: npy_uint32 = 0x00000004;
36+
pub const NPY_ITER_EXTERNAL_LOOP: npy_uint32 = 0x00000008;
37+
pub const NPY_ITER_COMMON_DTYPE: npy_uint32 = 0x00000010;
38+
pub const NPY_ITER_REFS_OK: npy_uint32 = 0x00000020;
39+
pub const NPY_ITER_ZEROSIZE_OK: npy_uint32 = 0x00000040;
40+
pub const NPY_ITER_REDUCE_OK: npy_uint32 = 0x00000080;
41+
pub const NPY_ITER_RANGED: npy_uint32 = 0x00000100;
42+
pub const NPY_ITER_BUFFERED: npy_uint32 = 0x00000200;
43+
pub const NPY_ITER_GROWINNER: npy_uint32 = 0x00000400;
44+
pub const NPY_ITER_DELAY_BUFALLOC: npy_uint32 = 0x00000800;
45+
pub const NPY_ITER_DONT_NEGATE_STRIDES: npy_uint32 = 0x00001000;
46+
pub const NPY_ITER_COPY_IF_OVERLAP: npy_uint32 = 0x00002000;
47+
pub const NPY_ITER_READWRITE: npy_uint32 = 0x00010000;
48+
pub const NPY_ITER_READONLY: npy_uint32 = 0x00020000;
49+
pub const NPY_ITER_WRITEONLY: npy_uint32 = 0x00040000;
50+
pub const NPY_ITER_NBO: npy_uint32 = 0x00080000;
51+
pub const NPY_ITER_ALIGNED: npy_uint32 = 0x00100000;
52+
pub const NPY_ITER_CONTIG: npy_uint32 = 0x00200000;
53+
pub const NPY_ITER_COPY: npy_uint32 = 0x00400000;
54+
pub const NPY_ITER_UPDATEIFCOPY: npy_uint32 = 0x00800000;
55+
pub const NPY_ITER_ALLOCATE: npy_uint32 = 0x01000000;
56+
pub const NPY_ITER_NO_SUBTYPE: npy_uint32 = 0x02000000;
57+
pub const NPY_ITER_VIRTUAL: npy_uint32 = 0x04000000;
58+
pub const NPY_ITER_NO_BROADCAST: npy_uint32 = 0x08000000;
59+
pub const NPY_ITER_WRITEMASKED: npy_uint32 = 0x10000000;
60+
pub const NPY_ITER_ARRAYMASK: npy_uint32 = 0x20000000;
61+
pub const NPY_ITER_OVERLAP_ASSUME_ELEMENTWISE: npy_uint32 = 0x40000000;
62+
63+
pub const NPY_ITER_GLOBAL_FLAGS: npy_uint32 = 0x0000ffff;
64+
pub const NPY_ITER_PER_OP_FLAGS: npy_uint32 = 0xffff0000;

0 commit comments

Comments
 (0)