numpy数组的形状与空列表比较

时间:2016-07-27 18:18:23

标签: python arrays list numpy

我在理解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)

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具有相同的形状。