我开始使用numpy cookbook独立学习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
我在索引和切片上阅读the documentation但仍无法理解上述代码。以下是我的困惑点:
1)范围(xmax)和范围(ymax)包括整个x,y轴。不将它们设置为零会使整个图像变黑吗?
2)范围(xmax-1,-1,-1)是什么意思?
谢谢你们!
答案 0 :(得分:2)
第一部分代码实际上是误导性的,并且依赖于lena
是方形图像的事实:发生的事情等同于调用zip(range(xmax), range(ymax))
,然后将每个结果元组设置为{ {1}}。你可以在这里看到可能出现的问题:如果0
,那么事情将无效:
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
,然后设置diag_max = min(xmax, ymax)
。
第二个问题的答案更容易:lena[range(diag_max), range(diag_max)] = 0
是对range(from, to, step)
的一般调用:
range
特别是,这会反转之前的列表,因此从右到左而不是从左到右抓住对角线。
答案 1 :(得分:2)
'range'会给你一个清单。在REPL中尝试一下,看看会发生什么:
r = range(5)
# r is no [0,1,2,3,4]
所以做'lena [range(xmax),range(ymax)] = 0'会将'lena'矩阵的对角线设置为零,因为你正在踩过x和y同时以增量方式坐标。
'range'非常简单。 @JLLagrange的答案完美地回答了它。