Python 使用numpy将范围设置为零

Python 使用numpy将范围设置为零,python,numpy,scipy,Python,Numpy,Scipy,我开始使用numpy食谱独立学习numpy。我审查并执行了以下代码: import scipy.misc import matplotlib.pyplot #This script demonstates fancy indexing by setting values #On the diagnols to 0 #Load lena array lena = scipy.misc.lena() xmax = lena.shape[0] ymax = lena.shape[1] #Fanc

我开始使用numpy食谱独立学习numpy。我审查并执行了以下代码:

import scipy.misc
import matplotlib.pyplot

#This script demonstates fancy indexing by setting values
#On the diagnols to 0

#Load lena array
lena = scipy.misc.lena()
xmax = lena.shape[0]
ymax = lena.shape[1]

#Fancy indexing
#can set ranges of points to zero, all at once instead of using loop
lena[range(xmax), range(ymax)] = 0
lena[range(xmax-1,-1,-1), range(ymax)] = 0
matplotlib.pyplot.imshow(lena)
matplotlib.pyplot.show()
我理解本规范中的所有内容,除了:

lena[range(xmax), range(ymax)] = 0
lena[range(xmax-1,-1,-1), range(ymax)] = 0
我读过索引和切片,但仍然无法理解上面的代码。以下是我的困惑:

1) 范围(xmax)和范围(ymax)包含整个x、y轴。将它们设置为零不会使整个图像变黑吗?

2) 范围(xmax-1,-1,-1)是什么意思


谢谢大家

第一位代码实际上是误导性的,并且依赖于
lena
是一个正方形图像的事实:所发生的事情相当于调用
zip(range(xmax),range(ymax))
,然后将每个结果元组设置为
0
。您可以看到这里可能出现的问题:if
xmax!=ymax
,那么事情就不会发生了:

>>> test = lena[:,:-3]
>>> test.shape
(512, 509)
>>> xmax, ymax = test.shape
>>> test[range(xmax), range(ymax)] = 0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: shape mismatch: objects cannot be broadcast to a single shape

特别是,这与前面的列表相反,因此从右到左而不是从左到右抓取对角线。

第一位代码实际上是误导性的,并且依赖于
lena
是一个正方形图像的事实:所发生的事情相当于调用
zip(range(xmax),range(ymax))
,然后将每个结果元组设置为
0
。您可以看到这里可能出现的问题:if
xmax!=ymax
,那么事情就不会发生了:

>>> test = lena[:,:-3]
>>> test.shape
(512, 509)
>>> xmax, ymax = test.shape
>>> test[range(xmax), range(ymax)] = 0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: shape mismatch: objects cannot be broadcast to a single shape

特别是,这与前面的列表相反,因此从右到左而不是从左到右获取对角线。

'range'将为您提供一个列表。在REPL中尝试一下,看看会发生什么:

r = range(5)
# r is no [0,1,2,3,4]

因此,执行'lena[range(xmax),range(ymax)]=0'会将'lena'矩阵的对角线设置为零,因为您同时递增地通过x和y坐标


“范围”很简单。@jlagrange的答案完美地回答了这个问题。

'range'将为您提供一个列表。在REPL中尝试一下,看看会发生什么:

r = range(5)
# r is no [0,1,2,3,4]

因此,执行'lena[range(xmax),range(ymax)]=0'会将'lena'矩阵的对角线设置为零,因为您同时递增地通过x和y坐标


“范围”很简单。@jlagrange的答案完美地回答了这个问题。

你的答案中没有解释1吗?而#2可以用
help(range)
来解释。你的答案中没有解释#1吗?#2可以用
帮助(范围)
“同时递增”来解释。啊!这是我遗漏的一个核心概念。我没意识到它同时在两个地方循环。那就更有意义了!谢谢“同时递增”。啊!这是我遗漏的一个核心概念。我没意识到它同时在两个地方循环。那就更有意义了!感谢“range(from,to,step)是对range的一般调用:“好吧,酷,我把range()和列表索引(使用分号)混在一起了。”。感谢您澄清这一点,上面的“range(from,to,step)”是对range的一般调用:“好吧,很酷,我把range()和列表索引(使用分号)混在一起了。”。感谢您澄清这一点和以上内容