制作类似维度的2D数组的数组时出现意外行为

3

例子:

def showArrayOfList(a,b,c):
    wlist = [np.zeros((szNext,szThis)) for (szThis,szNext) in [(a,b),(b,b),(b,b),(b,c)]]

    print "wlist:", map(np.shape,wlist)

    wArray = np.asarray(wlist)
    print "wArray:", map(np.shape,wArray)
    print "shape wArray:", shape(wArray)

np.zeros可以替换为返回给定形状的矩阵的任何其他矩阵函数。

以下是我期望得到的输出结果(也是实际得到的结果):

In[1]: ShowArrayOfList(1,4,5)
Out[1]: wlist: [(4, 1), (4, 4), (4, 4), (5, 4)]
wArray: [(4, 1), (4, 4), (4, 4), (5, 4)]
shape wArray: (4,) #An array of 4 references(?), to arrays of various sizes

In[2]: ShowArrayOfList(5,5,5)
Out[2]: wlist: [(5, 5), (5, 5), (5, 5), (5, 5)]
wArray: [(5, 5), (5, 5), (5, 5), (5, 5)]
shape wArray: (4, 5, 5) #4 arrays of shape (5,5)

但对于形式为a! = bb == c的输入,情况完全不同。

Int[3]: showArrayOfList(6,5,5)
Out[3]: wlist: [(5, 6), (5, 5), (5, 5), (5, 5)]
wArray: [(5,), (5,), (5,), (5,)] #Where did my second Dimension Go?
shape wArray: (4, 5)


Int[4]: showArrayOfList(2,4,4)
Out[4]:
wlist: [(4, 2), (4, 4), (4, 4), (4, 4)]
wArray: [(4,), (4,), (4,), (4,)] #Where did my second Dimension Go?
shape wArray: (4, 4)

这对我来说是一个非常难以找到的bug,经过一些思考,我认为它与广播系统有关。 我想要解释一下正在发生的事情。(我在脑海中有一个模糊的概念)
参考一下,我制作一个数组的数组是为了进行减法:
wArray=wArray-dWs
wList=[w-dW, (w,dW) in zip(wList,dWs)]更清晰易读。

在版本1.9.0dev中,最后两种情况下的wArray是一个由None组成的数组。如果我在交互模式下尝试,会出现ValueError: could not broadcast input array from shape (5,5) into shape (5)的错误。无论这是否是我的版本中的错误,这都不是构建数组的可靠方法。我认为wArray应该始终具有形状(4,),而不管a,b,c是什么。不应该有时是2D或3D。 - hpaulj
2个回答

2

只需简单地打印出数组,就可以很快地看到发生了什么事情。

至于最后一个维度去哪里了的问题。由于该维度的大小具有可变长度,因此Numpy不会为其创建新的维度,而是简单地创建一个对象数组(其中对象是长度不同的列表)。

showArrayOfList(2,4,4)的情况下,您的数组如下所示:

第一行:
[array([ 0., 0.]) array([ 0., 0.]) array([ 0., 0.]) array([ 0., 0.])]

第二至第四行:
[array([ 0., 0., 0., 0.]) array([ 0., 0., 0., 0.]) array([ 0., 0., 0., 0.]) array([ 0., 0., 0., 0.])]


0
创建 wArray 更一致的方式是将其初始化为一个(4,)对象数组,然后逐项填充:
n = len(wlist)
wArray = np.empty((n,), dtype='O')
for i in range(n):
    wArray[i] = wlist[i]

这不像 asarray(wlist) 那样漂亮,但无论 a,b,c 是什么,它都以相同的1,2方式分割3个维度。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接