我在理解python / numpy在与空列表进行比较时如何构建数组形状时遇到了一些问题 - 据我所知,这是与False的隐式(元素明智)比较。
在以下示例中,如果形状不大于1,则形状在最后一个维度中减1。
z = N.zeros((2,2,1))
z == []
>> array([], shape=(2, 2, 0), dtype=bool)
z2 = N.zeros((2,2,2))
z2 ==[]
>> False
但是,如果我直接与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)
答案 0 :(得分: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,所以第一个形状被“展开”,好像它被复制零次:
(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
的数组一样,因此结果与z
具有相同的形状。