2015-06-09 148 views
1

我目前正在嘗試追加多個Numpy數組在一起。基本上,我想要做的是從一個(1 x m)矩陣(技術上是一個矢量)開始,最後是一個(n x m)矩陣。所以從n(1 x m)矩陣(矢量)到1(n x m)矩陣(如果這是有道理的)。最終的目標是用numpy.savetxt()函數將矩陣寫入一個csv文件,這樣我就可以得到一個長度爲n列的csv文件。添加追加numpy數組

這樣做的問題是numpy.append()將向量附加到一個(1 x 2m)向量中。假設a1和a2是Numpy數組,每個數組有10000個元素。我將使用append函數將a2追加到a1中,同時創建一個名爲a的新數組,其中包含a1和a2。

a=np.append(a1, a2, axis=0) 
a.shape 
>>(20000,) 

我想,而不是對形狀,以這樣的形式

>>(2, 10000) 

或者更一般

>>(n, m) 

我應該怎麼辦呢?請注意,我想繼續添加矢量到數組中。謝謝你的時間!

+0

「a1」,「a2」等的來源是什麼?它們是否都存在於這個操作的開始,或者你是否必須在'a2'創建並附加後生成'a3'? – hpaulj

+0

我覺得你需要用np.array([...])''和'np.reshape'以及'np.concatenate'來玩更多的遊戲。這些是所有提議的變體('vstack','column_stack','append')的構建塊。在可用的地方查看Python代碼。 – hpaulj

回答

1

可以使用的numpy.column_stack

轉置例如:

import numpy as np 

a=np.array([1,2,3,4,5]) 
b=np.array([9,8,7,6,5]) 
c=np.column_stack((a,b)).T 

print c 
>>> array([[1, 2, 3, 4, 5], 
      [9, 8, 7, 6, 5]]) 

print a.shape,b.shape,c.shape 
>>> (5,) (5,) (2, 5) 

編輯

你可以繼續添加列,像這樣:

d=np.array([2,2,2,2,2]) 
c=np.column_stack((c.T,d)).T 
print c 
>>> array([[1, 2, 3, 4, 5], 
      [9, 8, 7, 6, 5], 
      [2, 2, 2, 2, 2]]) 
print c.shape 
>>> (3, 5) 
+0

嗯。我遇到的問題是,由於形狀問題,我無法繼續向c添加列。我如何繼續將這些(1 x m)向量添加到for循環內的(n x m)矩陣中?因爲目前,如果我想例如將一個數組d(形狀(1 x 5))添加到c中,我會得到形狀錯誤。 ValueError:除了連接軸之外的所有輸入數組維度必須完全匹配 –

+0

您可以使用c = np.column_stack((c.T,d))添加一個新列。看我的編輯 – tom

+0

Wohoo!這似乎工作!非常感謝。 –

0

這應該工作

a=np.append(a1, a2, axis=0).reshape(2,10000) 
a.shape 
>>(2,10000) 
0

爲了垂直合併陣列我會用np.vstack

import numpy as np 

np.vstack((a1,a2)) 

不過,從我的角度來看,numpy.array不應使用for循環和追加新的陣列,以舊創建。取而代之的是,無論是在創建第一個全numpy.array(n×m的),你從for循環中的數據寫入到該陣列,

data = np.zeros((n,m)) 

for i in range(n): 
    data[i] = ... 

或首次創建陣列使用append一個普通的Python列表,你可以在變換最後變成了numpy.array

data = [] 

for i in range(n): 
    data.append(...) 

data = np.asarray(data) 
+0

如果'a1','a2'等都是1d數組,則'np.array([a1,a2,a3,..])'和'vstack'一樣。這就是你最後一個例子所做的。 'vstack'對於增量構建會更好(其中一個數組是2d,其他數組是1d)。 – hpaulj

+0

@hpaulj:我不確定你的意思......我只是說我會在'for'循環中使用'np.vstack'而不是轉置的'np.column_stack'。在我的答案的另一部分,我只想強調,從我的('numpy')角度來看,這種方法總的來說效率不高。相反,我會使用我提出的兩個選項之一... – plonser