python - 在 numpy 中修改数组值时需要省略号 [...] 是什么?
问题描述
import numpy as np
a = np.arange(0,60,5)
a = a.reshape(3,4)
for x in np.nditer(a, op_flags = ['readwrite']):
x[...] = 2*x
print 'Modified array is:'
print a
在上面的代码中,为什么我们不能简单地写成 x=2*x 而不是 x[...]=2*x 呢?
解决方案
无论我们迭代的是哪种对象或该对象是如何实现的,几乎不可能对x = 2*x
那个对象做任何有用的事情。x = 2*x
是对变量的赋值x
;即使x
变量的先前内容是通过迭代某个对象获得的,新的赋值x
也不会影响我们正在迭代的对象。
在这种特定情况下,使用 迭代 NumPy 数组np.nditer(a, op_flags = ['readwrite'])
,循环的每次迭代都设置x
为一个零维数组,该数组是 的单元格的可写视图a
。x[...] = 2*x
写入零维数组的内容,而不是重新绑定x
变量。由于数组是 的单元格的视图a
,因此该赋值写入 的相应单元格a
。
l = []
这与l[:] = []
普通列表之间的区别非常相似,wherel[:] = []
将清除现有列表并将l = []
列表替换为新的空列表而不修改原始列表。但是,列表不支持视图或零维列表。
推荐阅读
- python-3.x - 熊猫添加平均列标题
- reactjs - 为什么我的 axios 向 nodemailer 发布请求会导致 431(请求标头字段太大)?
- python - 在不改变第一列的结果的情况下对两列的 numpy 数组进行排序
- python - 找不到模块 \atari_py\ale_interface\ale_c.dll (或其依赖项之一)
- java - 合并 mybatis 开关盒
- sql - Microsoft Access - 查询 - 最近的条目
- java - RecyclerView.SCROLL_STATE_DRAGGING 时如何暂停 ExoPlayer playerView 并在 Destroy 上释放播放器
- timer - STM32 TIM回调引发标志
- spring-boot - 如何在spring boot Oauth2上控制最大并发客户端
- delphi - FMX 窗口/面板中有多个水平 TSplitter