还有一个“隐藏维度”问题:
Numpy有一些性能驱动的技巧,如果不适当注意的话,可能会让您感到困惑:
有一些诀窍是np.view()创建的,将视图转换为“外部拥有的数据,这实际上意味着出现了隐藏共享的形式,如果已经在“return()-ed”image上执行了一些操作,那么将任何修改存储到一个刚刚创建的视图中,这可能会让您大吃一惊。在这种情况下,您的代码将无声地损坏“外部”-数据,因为您没有意识到或注意到,虽然>{}正确地报告了这两个数据,但它并没有“自己的数据,而只是通过一个“类似潜望镜的窗口”提供了原始数据的视图数据,仍然由其他人在某处拥有(这里,写入image,就像在一个示例性的image[0,0] = -1赋值中一样,实际上将“写入”-1,以将其存储到A-sA.data的“咽喉”,实际上是实际写存储操作的实现区,导致在A的数据中发生修改
)
.view()-s的这种副作用非常强大(如果有意使用,出于性能或其他原因),但也非常糟糕(如果在代码设计阶段没有检测到,只要“源”数据在不知情的情况下损坏,就可以跟踪魔鬼的尾巴)是谁把迄今为止清晰而合理的设计破坏了“外国的&;安全拥有的”“-幕后的数据。。。检测这种隐藏的共享写通可能要花很长时间,而且确实要花很长时间。。。如果它们是在没有您的事先意图的情况下发生的)>>> A = np.arange( 3*640*480 ).reshape( 3, 640, 480 )
>>> A.shape
(3, 640, 480)
>>> A.ndim
3
>>> B = A.view() # ENFORCE B BECOME A VIEW() ON AN ARRAY
>>> B.shape # B MIMICS AN ARRAY, WHILE IT IS NOT AN ARRAY
(3, 640, 480)
>>> B.ndim # B MIMICS AN ARRAY, WHILE IT IS NOT AN ARRAY
3
>>> B.flags # B MIMICS AN ARRAY, WHILE IT IS NOT AN ARRAY
C_CONTIGUOUS : True
F_CONTIGUOUS : False
OWNDATA : False <------------------- a view() on array, not the array itself
WRITEABLE : True
ALIGNED : True
WRITEBACKIFCOPY : False
UPDATEIFCOPY : False
>>> image = B[0,:,:] # slice B into an IMAGE, which will still look as if it is an array
>>> image.flags
C_CONTIGUOUS : True
F_CONTIGUOUS : False
OWNDATA : False <----------------- a view() onto an array, not the array itself
WRITEABLE : True
ALIGNED : True
WRITEBACKIFCOPY : False
UPDATEIFCOPY : False
>>> image.ndim
2
>>> image.shape
(640, 480)
希望您会喜欢用于性能或其他原因的.view()-s,并希望您永远不必在生产中跟踪隐藏的共享副作用。