Python numpy数组的形状与空列表的比较
我在理解python/numpy在与空列表进行比较时如何转换数组形状时遇到了一些问题,据我所知,空列表是一个隐式的(元素方面的)False比较 在下面的示例中,如果形状不大于1,则在最后一个标注中形状将减少1Python numpy数组的形状与空列表的比较,python,arrays,list,numpy,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 == []
>> 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)
这是工作中的普通广播。当你这样做的时候
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)
当
z
具有形状(2,2,2)
:
广播失败,因为长度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
相同这是正常的广播工作。当你这样做的时候
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)
当
z
具有形状(2,2,2)
:
广播失败,因为长度2轴和长度0轴不能相互广播。NumPy报告它不知道如何执行比较:
>>> numpy.zeros([2, 2, 2]).__eq__([])
NotImplemented
列表也不知道如何进行比较,因此Python使用默认的身份比较,并得到False
当您与
False
进行比较时:
z = N.zeros((2,2,1))
(z == False).shape
False
被解释为一个形状数组()
-一个空形状!这将广播到shape(2,2,1)
,就像复制到一个充满False
s的数组中一样,因此结果的形状与z
相同。我一直认为广播是将输出数组扩展到两个输入数组的最大形状(如果适用)。在这种情况下,情况并非如此。谢谢你的澄清!仅更改尺寸1
尺寸以匹配其他尺寸。尺寸2
永远不会扩展为与尺寸4
匹配。我会将广播序列描述为(2,2,1),(0,)=>(2,2,1),(1,1,0)=>(2,2,0)
。所有1
都已更改。我一直认为广播是将输出阵列扩展到两个输入阵列的最大形状(如果适用)。在这种情况下,情况并非如此。谢谢你的澄清!仅更改尺寸1
尺寸以匹配其他尺寸。尺寸2
永远不会扩展为与尺寸4
匹配。我会将广播序列描述为(2,2,1),(0,)=>(2,2,1),(1,1,0)=>(2,2,0)
。所有1
已更改。