下面的x[…]是什么意思
a=np.arange(6).重塑(2,3)
对于np.nditer中的x(a,op_标志=['readwrite']):
x[…]=2*x
而建议的复制Python省略号对象做什么?在一般的python上下文中回答这个问题,我认为在nditer循环中使用它需要添加信息
https://docs.scipy.org/doc/numpy/reference/arrays.nditer.html#modifying-数组值
Python中的常规赋值只是更改局部或全局变量字典中的引用,而不是就地修改现有变量。这意味着简单地分配给x不会将值放入数组的元素中,而是将x从数组元素引用切换为对所分配值的引用。若要实际修改数组的元素,应使用省略号索引x
该部分包括您的代码示例
所以用我的话来说,x[…]=…修改xx=…会中断到nditer变量的链接,而不会更改它。它类似于x[:]=…,但适用于任何维度的数组(包括0d)。在此上下文中,x不仅仅是一个数字,它是一个数组
也许最接近此nditer迭代的是,没有nditer:
[667]on
:对于np.ndenumerate(a)中的i,x:
…:打印(i,x)
…:a[i]=2*x
...:
(0, 0) 0
(0, 1) 1
...
(1, 2) 5
At[668]on:a
Output[668]:
数组([[0,2,4],
[ 6, 8, 10]])
注意,我必须直接索引和修改a[I]。我不能使用,x=2*x。在这个迭代中,x是一个标量,因此不可变
[669]on
:对于np.ndenumerate(a)中的i,x:
…:x[…]=2*x
...
TypeError:“numpy.int32”对象不支持项分配
但是在nditer案例中,x是一个0d数组,并且是可变的
[671]on
:对于np.nditer中的x(a,op_标志=['readwrite']):
…:打印(x,类型(x),x形状)
…:x[…]=2*x
...:
0<;类“numpy.ndarray”>;()
4<;类“numpy.ndarray”>;()
...
因为它是0d,所以不能使用x[:]代替x[…]
----gt;3 x[:]=2*x
索引器:数组的索引太多
更简单的数组迭代也可以提供以下信息:
[675]on
:对于a中的x:
…:打印(x,x.shape)
…:x[:]=2*x
...:
[ 0 8 16] (3,)
[24 32 40] (3,)
这将在a的行(第1个维度)上迭代x是一个1d数组,可以使用x[:]=…或x[…]=…进行修改
如果我在下一节中添加external\u loop标志,x现在是一个1d数组,x[:]=可以工作。但是x[…]=仍然有效,并且更加通用x[…]用于所有其他nditer示例
[677]on
:对于np.nditer中的x(a,op_标志=['readwrite',标志=['external_loop']):
…:打印(x,类型(x),x形状)
…:x[…]=2*x
[0 16 32 48 64 80]<;类“numpy.ndarray”>;(6,)
比较此简单的行迭代(在二维数组上):
[675]on
:对于a中的x:
…:打印(x,x.shape)
…:x[:]=2*x
...:
[ 0 8 16] (3,)
[24 32 40] (3,)
这将在a的行(第1个维度)上迭代x是一个1d数组,可以使用x[:]=…或x[…]=…进行修改
阅读并实验此nditer页面,一直读到最后。就其本身而言,nditer在python中并没有那么有用。它不会加速迭代—直到您将代码移植到cythonnp。ndindex是为数不多的使用nditer的未编译numpy函数之一