![](/img/trans.png)
[英]How to stack arrays of different shapes? Make a 3d-array from multiple 2d-arrays of different lengths
[英]Convert array of 2d-arrays to one 3d-array
我有一個 numpy 二維 numpy arrays 數組(句子的單詞嵌入數組),例如
embedded_sentences = np.array([ np.array([[1,2,3],[0,0,0]]), np.array([[10,20,30],[40,50,60]]) ])
我需要將此轉換為 3d 數組
np.array([ [[1,2,3],[0,0,0]], [[10,20,30],[40,50,60]] ])
即從shape(2,)
(兩個句子)到shape(2,2,3)
(兩個單詞的兩個句子,其中每個單詞嵌入 3 個維度)
這樣我就可以使用pytorch
使用torch.from_numpy(embedded_sentences)
對其進行轉換。
我已經嘗試過np.vstack(embedded_sentences)
和np.dstack(embedded_sentences)
但這似乎不起作用。
編輯
我可以這樣做
embedded_sentences = np.dstack(embedded_sentences) embedded_sentences = np.transpose(embedded_sentences,(2,0,1))
這有效,但不漂亮。
復制粘貼您的代碼會立即生成 3d 數組。
但是,如果我們 go 確保它是一維 object dtype 數組的額外步驟:
In [16]: x = np.empty(2,object); x[:] = list(embedded_sentences) In [17]: x Out[17]: array([array([[1, 2, 3], [0, 0, 0]]), array([[10, 20, 30], [40, 50, 60]])], dtype=object)
這實際上是 2 個 arrays 的列表。 我們可以像np.array
一樣使用np.stack
加入它們:
In [18]: np.stack(x) Out[18]: array([[[ 1, 2, 3], [ 0, 0, 0]], [[10, 20, 30], [40, 50, 60]]])
我可能應該堅持查看您嘗試的替代方案有什么問題,例如vstack
和dstack
:
In [19]: np.vstack(x) Out[19]: array([[ 1, 2, 3], [ 0, 0, 0], [10, 20, 30], [40, 50, 60]]) In [20]: np.dstack(x) Out[20]: array([[[ 1, 10], [ 2, 20], [ 3, 30]], [[ 0, 40], [ 0, 50], [ 0, 60]]])
正如您發現的那樣,可以轉置dstack
。 vstack
可以重新整形。
所有這些stack
函數都會調整一些維度並執行np.concatenate
。
您的輸入已經具有所需的形狀和元素。 請看下面的代碼片段:
In [1]: import numpy as np In [2]: embedded_sentences = \...: np.array([...: np.array([[1,2,3],[0,0,0]]),...: np.array([[10,20,30],[40,50,60]])...:...: ]) In [3]: embedded_sentences.shape Out[3]: (2, 2, 3)
我猜你的意思是:
我有一個 2d-numpy arrays 的numpy 數組列表(句子的單詞嵌入數組),例如
In [4]: embedded_sentences = \...: [...: np.array([[1,2,3],[0,0,0]]),...: np.array([[10,20,30],[40,50,60]])...: ]
如果是,那么np.array
應該足夠了,如下所示:
In [5]: embedded_sentences = np.array(embedded_sentences) In [6]: embedded_sentences Out[6]: array([[[ 1, 2, 3], [ 0, 0, 0]], [[10, 20, 30], [40, 50, 60]]]) In [7]: embedded_sentences.shape Out[7]: (2, 2, 3)
但是,在您的帖子中,您提到這將成為pytorch
的輸入。 因此,可以直接使用pytorch
,如下圖:
In [8]: import torch In [9]: t = torch.tensor(embedded_sentences) In [10]: t Out[10]: tensor([[[ 1, 2, 3], [ 0, 0, 0]], [[10, 20, 30], [40, 50, 60]]]) In [11]: t.shape Out[11]: torch.Size([2, 2, 3]) In [12]: t.dtype Out[12]: torch.int64
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.