2016-07-27 39 views
0

我有一些问题,理解python/numpy如何在比较空列表时进行数组形状的转换 - 就我所知,这是一个与False的隐式(元素明智)比较。numpy与空列表比较阵列的形状

在下面的示例形状由一个在最后一个维度减小,如果它不大于1

z = N.zeros((2,2,1)) 
z == [] 

>> array([], shape=(2, 2, 0), dtype=bool) 

z2 = N.zeros((2,2,2)) 
z2 ==[] 

>> False 

但是,如果我用假直接比较,我得到预期的输出。

z = N.zeros((2,2,1)) 
(z == False).shape 

>> (2, 2, 2) 


z2 = N.zeros((2,2,2)) 
(z2 == False).shape 

>> (2, 2, 1) 

回答

2

这是在工作中的普通广播。当你

z = N.zeros((2,2,1)) 
z == [] 

[]被解释为形状(0,)的阵列,然后将形状彼此广播:

(2, 2, 1) 
vs (0,) 

由于(0,)(2, 2, 1)较短,它就会被扩大,因为如果该阵列被重复复制:

(2, 2, 1) 
vs (2, 2, 0) 

并且由于在第一个形状中存在1并且其他形状不具有1那里,第一形状被“膨胀”,如同其被复制倍:因此

(2, 2, 0) 
vs (2, 2, 0) 

比较结果在布尔值的阵列具有形状(2, 2, 0)


z具有形状(2, 2, 2)

z2 = N.zeros((2,2,2)) 
z2 ==[] 

广播失败,因为一个长度为2的轴和一个长度-0轴不能相对于彼此进行广播。 NumPy的报告说,它不知道如何进行比较:

>>> numpy.zeros([2, 2, 2]).__eq__([]) 
NotImplemented 

列表不知道怎么要么,所以Python倒在通过身份默认比较,并得到的False结果。


当你比较反对False

z = N.zeros((2,2,1)) 
(z == False).shape 

False被解释为形状()阵列 - 一个空的形状!这被广播出来形成(2, 2, 1),仿佛被拷贝到一个完整的False s的阵列,所以结果与z的形状相同。

+0

我总是将广播理解为将输出数组扩展为两个输入数组的最大形状(如果适用)。在这种情况下,这是不正确的。谢谢澄清! – dbacc

+1

只有尺寸'1'尺寸被改变以匹配其他尺寸。尺寸'2'永远不会扩大到匹配尺寸'4'。我会将广播序列描述为(2,2,1),(0,)=>(2,2,1),(1,1,0)=>(2,2,0)'。所有'1'都被改变了。 – hpaulj