制作具有相似尺寸的2D阵列阵列时出现意外行为

时间:2014-01-23 12:54:19

标签: python arrays numpy multidimensional-array jagged-arrays

MWE:

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)]

2 个答案:

答案 0 :(得分: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.])]

答案 1 :(得分: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个维度。