2014-10-19 55 views
3

我想有一個numpy數組的另外兩個數組(每個都有不同的形狀)。據我所知,由於這個原因,在主陣列的定義中必須使用:dtype = objectnumpy.array與不同形狀的元素

例如,讓我們定義(在Python 2.7)我們的數組作爲

 a0 = np.arange(2*2).reshape(2,2) 
    a1 = np.arange(3*3*2).reshape(3,3,2) 
    b = np.array([a0,a1], dtype = object) 

這完美的作品:b[1]是一樣的a1。但是,如果我改變從(2,2)在a0的尺寸(3,3),奇怪的事情發生:

 a0 = np.arange(3*3).reshape(3,3) 
    a1 = np.arange(3*3*2).reshape(3,3,2) 
    b = np.array([a0,a1], dtype = object) 

這次b[1]a1是不相等的,他們甚至有不同的形狀。這種奇怪行爲的原因是什麼?

也許對我來說有一個完全不同的解決方案。但我不想使用列表或元組,因爲我想允許添加如b + b。很明顯,我可以爲此目的寫自己的課,但有沒有更簡單的方法?

回答

2

如果要明確一個對象數組,可以先創建對象類型的空數組並分配給它:

x = empty(5, dtype=object) 
x[0] = zeros((3,3)) 
x[1] = zeros((3,2)) #does not merge axes. 
x[2] = eye(4) 
x[3] = ones((2,2))*2 
x[4] = arange(10).reshape((5,2)) 

>>> x+x 
array([array([[ 0., 0., 0.], 
    [ 0., 0., 0.], 
    [ 0., 0., 0.]]), 
    array([[ 0., 0.], 
    [ 0., 0.], 
    [ 0., 0.]]), 
    array([[ 2., 0., 0., 0.], 
    [ 0., 2., 0., 0.], 
    [ 0., 0., 2., 0.], 
    [ 0., 0., 0., 2.]]), 
    array([[ 4., 4.], 
    [ 4., 4.]]), 
    array([[ 0, 2], 
    [ 4, 6], 
    [ 8, 10], 
    [12, 14], 
    [16, 18]])], dtype=object) 

你必須填寫所有元素,然後才能執行算術,或增長使用np.append從零開始的元素。

+0

在你的例子中,不可能對整個數組''執行算術運算。例如,'x + x'將不起作用。 – cheyp 2014-10-20 10:57:08

+1

是的,你可以!正如我所說的,你只需要填充0..4的所有元素(但只給出了前兩個例子)。 – mdurant 2014-10-20 14:17:08

3

我不認爲這是一個奇怪的行爲,這是你使用numpy的方式,這對我來說很奇怪。

numpy合併尺寸儘可能多。這是默認行爲,是使用數組時的預期行爲。在第一個例子中,a0a1的所有尺寸都不相同。 numpy被迫只使用第一維。因此,如果我們在第一個示例中查看b.shape,我們將看到(2,)

在第二個示例中,a0a1具有與最後一個維度相同的維度大小。所以numpy合併了這些級別。如果您在這裏查看b.shape,您會看到(2,3,3),因爲第二個和第三個維度的大小相同。