2016-03-08 111 views
0

我試圖在可以繼續增大尺寸的更大的3D陣列(稱爲STACK)內存儲多個2D陣列(STAR)。我需要STACK是一個全局參數,可以隨時通過多個函數訪問。要做到這一點,我使用numpy.dstack()到目前爲止,這是我的代碼看起來像試過:在更大的3D陣列內存儲2D陣列

box_size = np.shape(star)[0] 
# The 2D array I'm trying to add to the STACK 
STAR = [[1, 1, 1, 1, 1],\ 
     [1, 1, 2, 1, 1],\ 
     [1, 2, 3, 2, 1],\ 
     [1, 1, 2, 1, 1],\ 
     [1, 1, 1, 1, 1,]] 
# Initialize STACK to be an empty array the same size as STAR 
STACK = np.zeros((2*(box_size/2)+1,2*(box_size/2)+1)) 

# A function that appends STAR to STACK 
def add_Star(STAR): 
    np.dstack((STACK,STAR)) 

# Call the function 
add_Star(STAR) 

然而,當我嘗試打印更新STACK,我得到

[[ 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.]] 

我不知道如果我錯過了明顯的或完全濫用功能的東西。

要清楚,我希望STACK成爲我添加到它的每個STAR的記憶。也就是說,如果需要,我希望每個STAR都可以在STACK中訪問,稍後再刪除它。在實踐中,每個STAR都會有所不同,所以簡單地將STACK添加到STAR不會起作用。

回答

1

似乎有在這裏是幾混亂。

首先,下面的代碼應該做你希望它是什麼,以儘可能少的變化可能:

# The 2D array I'm trying to add to the STACK 
STAR = [[1, 1, 1, 1, 1],\ 
     [1, 1, 2, 1, 1],\ 
     [1, 2, 3, 2, 1],\ 
     [1, 1, 2, 1, 1],\ 
     [1, 1, 1, 1, 1,]] 
STAR = np.asarray(STAR) 


# Initialize STACK to be an empty array the same size as STAR 
STACK = np.zeros(STAR.shape, np.float_) 

# A function that appends STAR to STACK 
def add_Star(star): 
    out = np.dstack((STACK,star)) 

    return out 

# Call the function 
STACK = add_Star(STAR) 

現在,讓我們打破原因。最重要的是,你的函數中的變量在star

高清add_Star(星)

不必是相同的名稱作爲變量的其他地方在你的代碼(事實上不應該,因爲它混淆)。只有在函數調用

STACK = add_Star(STAR)

你需要喂一些變量別處定義的功能。

你會注意到我還添加了返回函數,因爲我將你的問題解釋爲希望能夠重複運行add_Star,並且每次都輸出擴展的STACK。

此外,一個簡單的方法來看到任何給定陣列的尺寸是

array.shape

你會看到我使用的定義堆棧的形狀,而不是去通過定義box_size的額外步驟。

最後,您定義的STAR不是數組形式。在使用numpy時,只需使用np.asarray就可以像列入數組格式一樣獲取列表。

0

你可以通過使用append功能做到這一點使用列表:

STAR_1 = [[1, 1, 1, 1, 1],\ 
     [1, 1, 2, 1, 1],\ 
     [1, 2, 3, 2, 1],\ 
     [1, 1, 2, 1, 1],\ 
     [1, 1, 1, 1, 1,]] 

STACK = [STAR_1] 

STAR_2 = [[2, 2, 2, 2, 2],\ 
     [1, 1, 2, 1, 1],\ 
     [1, 2, 3, 2, 1],\ 
     [1, 1, 2, 1, 1],\ 
     [1, 1, 1, 1, 1,]] 

STACK.append(STAR_2) 
print(STACK) 

這將打印:

[[[1, 1, 1, 1, 1], 
    [1, 1, 2, 1, 1], 
    [1, 2, 3, 2, 1], 
    [1, 1, 2, 1, 1], 
    [1, 1, 1, 1, 1]], 
[[2, 2, 2, 2, 2], 
    [1, 1, 2, 1, 1], 
    [1, 2, 3, 2, 1], 
    [1, 1, 2, 1, 1], 
    [1, 1, 1, 1, 1]]] 
0

讓我們來簡化你的操作了一下,於一個5x5的一個使用你的價值觀更好地瞭解正在發生的事情

In [125]: n=5 

star數組

In [126]: star=np.array([[1, 1, 1, 1, 1],\ # don't need the \ 
     [1, 1, 2, 1, 1],\ 
     [1, 2, 3, 2, 1],\ 
     [1, 1, 2, 1, 1],\ 
     [1, 1, 1, 1, 1,]]) 
In [127]: star 
Out[127]: 
array([[1, 1, 1, 1, 1], 
     [1, 1, 2, 1, 1], 
     [1, 2, 3, 2, 1], 
     [1, 1, 2, 1, 1], 
     [1, 1, 1, 1, 1]]) 

初始stack到相同的零尺寸。這與'空'數組不一樣。

In [128]: stack=np.zeros((5,5)) 

In [130]: newstack=np.dstack((stack,star)) 
In [131]: newstack.shape 
Out[131]: (5, 5, 2) 

dstack不像列表追加。它使一個新的陣列。注意形狀 - 3d。

In [132]: newstack 
Out[132]: 
array([[[ 0., 1.], 
     [ 0., 1.], 
     [ 0., 1.], 
     [ 0., 1.], 
     [ 0., 1.]], 
.... 

請注意,它有零和星形值。

In [133]: newstack=np.dstack((newstack,star)) 
In [134]: newstack.shape 
Out[134]: (5, 5, 3) 

你真的想這樣做嗎?

下面是逐步構建以3D陣列的一個更好的辦法:

In [135]: alist=[] 
In [136]: alist.append(star) 
In [137]: alist.append(star) 
In [138]: alist 
Out[138]: 
[array([[1, 1, 1, 1, 1], 
     [1, 1, 2, 1, 1], 
     [1, 2, 3, 2, 1], 
     [1, 1, 2, 1, 1], 
     [1, 1, 1, 1, 1]]), array([[1, 1, 1, 1, 1], 
     [1, 1, 2, 1, 1], 
     [1, 2, 3, 2, 1], 
     [1, 1, 2, 1, 1], 
     [1, 1, 1, 1, 1]])] 
In [139]: np.array(alist) 
Out[139]: 
array([[[1, 1, 1, 1, 1], 
     [1, 1, 2, 1, 1], 
     [1, 2, 3, 2, 1], 
     [1, 1, 2, 1, 1], 
     [1, 1, 1, 1, 1]], 

...) 
In [140]: _.shape 
Out[140]: (2, 5, 5) 

注意np.array加入組件沿着新中軸線,在前面。這是在numpy中更好的地方。

你提到刪除'星'後;如果將它放在列表中,這會更容易。如果您需要在「星號」上進行計算,則3d數組格式非常有用,否則可能不需要。


或者,如果您知道將有多少star有,你可以在初始的stack到合適的大小,並指定值:

In [146]: stack=np.zeros((2,5,5),dtype=int) 
In [147]: stack[0,:,:] = star 
In [148]: stack[1,:,:] = star*2 
In [149]: stack 
Out[149]: 
array([[[1, 1, 1, 1, 1], 
     [1, 1, 2, 1, 1], 
     [1, 2, 3, 2, 1], 
     [1, 1, 2, 1, 1], 
     [1, 1, 1, 1, 1]], 

     [[2, 2, 2, 2, 2], 
     [2, 2, 4, 2, 2], 
     [2, 4, 6, 4, 2], 
     [2, 2, 4, 2, 2], 
     [2, 2, 2, 2, 2]]]) 

這也是不是反覆使用dstack更好(或一些其他級聯)。

+0

我想使用這種方法,但是,我必須能夠初始化STACK零(稍後用於繪圖目的),而不必知道最終將多少個STAR添加到STACK。如果不使用'dstack',還有辦法嗎? – maelstromscientist

+0

追加到列表是最有意義的。列表中的第一個數組可能是一個零「STAR」。 – hpaulj