原文:https://docs.scipy.org/doc/numpy/reference/generated/numpy.nditer.html
校对:(虚位以待)
numpy.
nditer
[source]有效的多维迭代器对象迭代数组。要开始使用此对象,请参阅introductory guide to array iteration。
参数: | op:ndarray或array_like的序列
flags:str的序列,可选
op_flags:str列表的列表,可选
op_dtypes:dtype(s)的dtype或tuple,可选
订单:{'C','F','A','K'},可选
投射:{'no','equiv','safe','same_kind','unsafe'},可选
op_axes:ints列表列表,可选
itershape:ints的tuple,可选
buffersize:int,可选
|
---|
笔记
nditer
取代flatiter
。nditer
后的迭代器实现也由Numpy C API公开。
Python暴露提供了两个迭代接口,一个遵循Python迭代器协议,另一个镜像C风格的do-while模式。原生Python方法在大多数情况下更好,但如果你需要迭代器的坐标或索引,使用C风格模式。
例子
下面是我们如何使用Python迭代器协议编写一个iter_add
函数:
def iter_add_py(x, y, out=None):
addop = np.add
it = np.nditer([x, y, out], [],
[['readonly'], ['readonly'], ['writeonly','allocate']])
for (a, b, c) in it:
addop(a, b, out=c)
return it.operands[2]
这里是同样的功能,但遵循C风格模式:
def iter_add(x, y, out=None):
addop = np.add
it = np.nditer([x, y, out], [],
[['readonly'], ['readonly'], ['writeonly','allocate']])
while not it.finished:
addop(it[0], it[1], out=it[2])
it.iternext()
return it.operands[2]
这里是一个示例外部产品函数:
def outer_it(x, y, out=None):
mulop = np.multiply
it = np.nditer([x, y, out], ['external_loop'],
[['readonly'], ['readonly'], ['writeonly', 'allocate']],
op_axes=[range(x.ndim)+[-1]*y.ndim,
[-1]*x.ndim+range(y.ndim),
None])
for (a, b, c) in it:
mulop(a, b, out=c)
return it.operands[2]
>>> a = np.arange(2)+1
>>> b = np.arange(3)+1
>>> outer_it(a,b)
array([[1, 2, 3],
[2, 4, 6]])
这里是一个示例函数,其操作类似于“lambda”ufunc:
def luf(lamdaexpr, *args, **kwargs):
"luf(lambdaexpr, op1, ..., opn, out=None, order='K', casting='safe', buffersize=0)"
nargs = len(args)
op = (kwargs.get('out',None),) + args
it = np.nditer(op, ['buffered','external_loop'],
[['writeonly','allocate','no_broadcast']] +
[['readonly','nbo','aligned']]*nargs,
order=kwargs.get('order','K'),
casting=kwargs.get('casting','safe'),
buffersize=kwargs.get('buffersize',0))
while not it.finished:
it[0] = lamdaexpr(*it[1:])
it.iternext()
return it.operands[0]
>>> a = np.arange(5)
>>> b = np.ones(5)
>>> luf(lambda i,j:i*i + j/2, a, b)
array([ 0.5, 1.5, 4.5, 9.5, 16.5])
属性
dtypes | (dtype(s)的元组)value 中提供的值的数据类型。如果启用缓冲,这可能不同于操作数数据类型。 |
完成 | (bool)操作数上的迭代是否完成。 |
has_delayed_bufalloc | (bool)如果为True,迭代器使用“delay_bufalloc”标志创建,并且尚未调用reset()函数。 |
has_index | (bool)如果为True,迭代器使用“c_index”或“f_index”标志创建,并且属性index 可用于检索它。 |
has_multi_index | (bool)如果为True,迭代器使用“multi_index”标志创建,并且属性multi_index 可用于检索它。 |
指数: | 当使用“c_index”或“f_index”标志时,此属性提供对索引的访问。如果访问时引发ValueError,并且has_index 为False。 |
iterationneedsapi | (bool)迭代是否需要访问Python API,例如,如果其中一个操作数是对象数组。 |
iterindex | (int)匹配迭代次序的索引。 |
itersize | (int)迭代器的大小。 |
itviews: | 存储器中operands 的结构化视图,匹配重新排序和优化的迭代器访问模式。 |
multi_index: | 当使用“multi_index”标志时,此属性提供对索引的访问。如果访问访问并且has_multi_index 为False,则引发ValueError。 |
ndim | (int)迭代器的维度。 |
nop | (int)迭代器操作数的数量。 |
操作数 | (操作数的元组)要迭代的数组。 |
形状 | (intup的tuple)形状元组,迭代器的形状。 |
值: | 在当前迭代的operands 的值。通常,这是一个数组的数组标量,但如果使用标志“external_loop”,它是一维数组的元组。 |
方法
copy () |
获取迭代器的当前状态的副本。 |
debug_print () |
打印nditer 实例的当前状态并将调试信息输出到stdout。 |
enable_external_loop () |
当在构造期间没有使用“external_loop”时,这是修改迭代器的行为,如同指定了标志。 |
iternext () |
检查是否留下迭代,并执行单个内部迭代,而不返回结果。 |
next |
|
remove_axis (i) |
从迭代器中删除轴i。 |
remove_multi_index () |
当指定“multi_index”标志时,这将删除它,允许内部迭代结构进一步优化。 |
reset () |
将迭代器重置为其初始状态。 |