簡體   English   中英

將2D陣列存儲在更大的3D陣列中

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM