2017-03-05 82 views
-1

我想以靈活的方式在數組中創建數組。這個問題可能最好通過一個例子來說明。如何創建給定大小的數組(陣列數組)的層數

我們想要構建一個三層數組。每層的大小由以下給出:

S1, S2, S3 = 3, [3,2,2], 4 

每個常量表示我想要構造的數組的大小。 S1代表外層並對應於len(S2)。 S2表示下一層,其中每個層必須具有與該列表中的該元素相對應的大小。最後,S3代表最內層中每個陣列的大小。

我知道一種方法來做到這一點。

V = np.array([ 
np.array([np.zeros(S3), np.zeros(S3), np.zeros(S3)]), 
np.array([np.zeros(S3), np.zeros(S3)]), 
np.array([np.zeros(S3), np.zeros(S3)]) 
]) 

但是,如果S1或S2改變,這是非常不切實際的。你如何儘可能有效地爲S1和S2創建這樣一個數組?

我希望這個問題有道理。如果不是,我會盡我所能擴大或重新提出這個問題。

在此先感謝。

+0

所以S1真的是重複的信息,因爲'S1 == LEN(S2)' – trincot

回答

1

看看你V表達創造了什麼:

In [3]: V 
Out[3]: 
array([ array([[ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.]]), 
     array([[ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.]]), 
     array([[ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.]])], dtype=object) 
In [4]: V.shape 
Out[4]: (3,) 
In [5]: V[0].shape 
Out[5]: (3, 4) 
In [6]: V[1].shape 
Out[6]: (2, 4) 
In [7]: V[2].shape 
Out[7]: (2, 4) 

這是一個3元的對象類型數組。元素是2d浮點數組。

如果我改變了第一子陣列,以只包含2個陣列,得到了一個三維陣列

In [11]: V1 = np.array([ 
    ...: np.array([np.zeros(S3), np.zeros(S3)]), 
    ...: np.array([np.zeros(S3), np.zeros(S3)]), 
    ...: np.array([np.zeros(S3), np.zeros(S3)]) 
    ...: ]) 
In [12]: V1.shape 
Out[12]: (3, 2, 4) 

構建數組的數組是棘手,因爲np.array嘗試構建一個多維數組,而不是參差不齊的對象陣列。

@trincot's嵌套列表是更可預測

In [15]: L1 = [[[0]*S3 for _ in range(size)] for size in S2] 
In [16]: L1 
Out[16]: 
[[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]], 
[[0, 0, 0, 0], [0, 0, 0, 0]], 
[[0, 0, 0, 0], [0, 0, 0, 0]]] 

通常對象陣列的D型細胞陣列來構建疼痛,也很少超過相似列表提供處理的優點。

扔幾array包裝和嵌套列表理解複製您的V

A3 = np.array([np.array([np.zeros(S3) for _ in range(size)]) for size in S2]) 

它概括你的V表達,但是,它並沒有改善。

爲了確保我有3個陣列層我不得不做出這樣一個結構:

In [25]: A1=np.zeros((S1,),object) 
In [27]: for i,n in enumerate(S2): 
    ...:  A = np.zeros((n,), object) 
    ...:  for j in range(n): 
    ...:   A[j]=np.zeros(S3) 
    ...:  A1[i]=A 
In [28]: A1 
Out[28]: 
array([ array([array([ 0., 0., 0., 0.]), array([ 0., 0., 0., 0.]), 
     array([ 0., 0., 0., 0.])], dtype=object), 
     array([array([ 0., 0., 0., 0.]), array([ 0., 0., 0., 0.])], dtype=object), 
     array([array([ 0., 0., 0., 0.]), array([ 0., 0., 0., 0.])], dtype=object)], dtype=object) 
In [29]: A1.shape 
Out[29]: (3,) 
In [30]: A1[0].shape 
Out[30]: (3,) 
In [31]: A1[0][0].shape 
Out[31]: (4,) 
2

你可以這樣做:

[[[0]*s3 for _ in range(size)] for size in s2] 

s1真的不需要的信息,因爲s1 == len(s2)

+0

我增加了S1只是爲了清楚。但是,這項工作,謝謝。我想通過製作numpy數組,我實際上工作得太過份了,但實際上有一個使用列表的簡單方法。 – user7012893