使用numpy将范围设置为零

时间:2014-02-23 17:11:26

标签: python numpy scipy

我开始使用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)是什么意思?

谢谢你们!

2 个答案:

答案 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的答案完美地回答了它。