![](/img/trans.png)
[英]Writing a 3D numpy array into a slice of a larger 3D array using a 2D mask
[英]Storing 2D array inside a larger 3D array
我試圖將多個2D數組(STAR)存儲在可以繼續增長的更大3D數組(稱為STACK)中。 我需要STACK是可以隨時通過多個函數訪問的全局參數。 為此,我嘗試使用numpy.dstack()
到目前為止,這是我的代碼如下所示:
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)
但是,當我嘗試打印更新的堆棧時,我得到
[[ 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。 實際上,每個STAR都將有所不同,因此僅將STACK添加到STAR是行不通的。
這里似乎有些混亂。
首先,以下代碼應做您想要的事,並盡可能減少更改:
# 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
中
def add_Star(star)
不必與代碼中其他位置的變量具有相同的名稱(並且實際上不應該如此,因為它令人困惑)。 僅在函數調用中
堆棧= add_Star(STAR)
您是否需要向函數提供一些在其他地方定義的變量。
您會注意到,我還向函數添加了return,因為我將您的問題解釋為希望能夠重復運行add_Star,並且每次都輸出擴展的STACK。
另外,查看任何給定數組的尺寸的一種簡單方法是
數組形狀
您會看到我用它來定義堆棧的形狀,而不是經過定義box_size的額外步驟。
最后,您定義的STAR不是數組形式。 當使用numpy時,很容易使用np.asarray來獲得一個像數組格式一樣的列表。
您可以通過使用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]]]
讓我們簡化一下操作,以更好地了解發生了什么
In [125]: n=5
使用值將star
排列成一個5x5的陣列
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
(或其他串聯)更好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.