我开始使用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)range(xmax)和range(ymax)包含整个x,y轴。不会将它们设置为零会使整个图像变黑吗?
2)range(xmax-1,-1,-1)是什么意思?
谢谢你们!
代码的第一位实际上是令人误解的,并且依赖于lena
一个正方形图像的事实:发生的事情等同于调用zip(range(xmax), range(ymax))
,然后将每个结果元组设置为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
:
>>> range(1, 10, 2)
[1, 3, 5, 7, 9]
>>> range(1, 10, -2)
[]
>>> range(10, 1, -2)
[10, 8, 6, 4, 2]
>>> range(10, 0, -1)
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
特别是,这会反转前一个列表,因此从右到左而不是从左到右抓住对角线。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句