2012-11-18 39 views
2

下面的循環的每次迭代使用產生尺寸50X1 Id喜歡來自環路的所有向量存儲整體成單個數據結構的一個矢量。存儲這些載體但數據結構在Python

def get_y_hat(y_bar, x_train, theta_Ridge_Matrix): 
    print theta_Ridge_Matrix.shape 
    print theta_Ridge_Matrix.shape[0] 
    for i in range(theta_Ridge_Matrix.shape[0]): 
     yH = np.dot(x_train, theta_Ridge_Matrix[i].T) 
     print yH 

我應該使用哪種數據結構?進出口新的Python的,但基於什麼伊夫研究網上有2種選擇:numpy的陣列,並列出

的名單我以後需要訪問此方法外50個元素的每個矢量。我可能會存儲200到500個矢量。

可能有人給我這樣的數據結構的示例代碼以及

感謝

+3

有一些理由不使用二維數組numpy的? – DarenW

+0

是的,我想但是,如何將yH值附加到二維數組? – banditKing

+3

在這種情況下,存儲一維numpy陣列列表可能是您的最佳解決方案。存儲列表的列表很快就會變得過於消耗內存,並且添加到numpy數組效率不高。通常,當從未知數量的較小數組中構建一個numpy數組時,最簡單(也是最快)將較小的數組存儲爲列表,然後在最後將它們堆疊在一起。 –

回答

0

我建議使用numpy的進行,你需要

從這個網站安裝在Windows上:

http://sourceforge.net/projects/numpy/files/NumPy/

一些例子,說明你可以使用它。

import numpy as np 

,我們將建立一個數組,我們將其命名爲墊

>>> mat = np.random.randn(2,3) 
>>> mat 
array([[ 1.02063865, 1.52885147, 0.45588211], 
     [-0.82198131, 0.20995583, 0.31997462]]) 

陣列被使用動詞「T」

>>> mat.T 
array([[ 1.02063865, -0.82198131], 
     [ 1.52885147, 0.20995583], 
     [ 0.45588211, 0.31997462]]) 

任何陣列的形狀通過使用改變的轉置\動詞「重塑」方法

>>> mat = np.random.randn(3,6) 
array([[ 2.01139326, 1.33267072, 1.2947112 , 0.07492725, 0.49765694, 
     0.01757505], 
     [ 0.42309629, 0.95921276, 0.55840131, -1.22253606, -0.91811118, 
     0.59646987], 
     [ 0.19714104, -1.59446001, 1.43990671, -0.98266887, -0.42292461, 
     -1.2378431 ]]) 
>>> mat.reshape(2,9) 
array([[ 2.01139326, 1.33267072, 1.2947112 , 0.07492725, 0.49765694, 
     0.01757505, 0.42309629, 0.95921276, 0.55840131], 
     [-1.22253606, -0.91811118, 0.59646987, 0.19714104, -1.59446001, 
     1.43990671, -0.98266887, -0.42292461, -1.2378431 ]]) 

我們可以使用\動詞「形」的屬性改變變量的形狀。

>>> mat = np.random.randn(4,3) 
>>> mat.shape 
(4, 3) 
>>> mat 
array([[-1.47446507, -0.46316836, 0.44047531], 
     [-0.21275495, -1.16089705, -1.14349478], 
     [-0.83299338, 0.20336677, 0.13460515], 
     [-1.73323076, -0.66500491, 1.13514327]]) 
>>> mat.shape = 2,6 
>>> mat.shape 
(2, 6) 

>>> mat 
array([[-1.47446507, -0.46316836, 0.44047531, -0.21275495, -1.16089705, 
     -1.14349478], 
     [-0.83299338, 0.20336677, 0.13460515, -1.73323076, -0.66500491, 
     1.13514327]]) 
+0

不要混淆numpy陣列與numpy矩陣 – Benjamin

+0

感謝您的反饋Benjamin。你是對的。它是一個數組而不是矩陣,我調整了這個單詞,如果你感覺並糾正錯誤,你可以編輯或調整它,再次感謝。 – mazlor

0

我不能,因爲我以前沒有使用一個numpy的陣列上發表評論,但使用的列表列表Python已經內置支持。

例如可以這樣做:

AList = [1, 2, 3] 
BList = [4, 5, 6] 
CList = [7, 8, 9] 
List_of_Lists = [] 

List_of_Lists.append(AList) 
List_of_Lists.append(BList) 
List_of_Lists.append(CList) 

print(List_of_Lists) 

這將一代產量:

[[1, 2, 3], [4, 5, 6], [7, 8, 9]] 

也有其他的方式,你可以去從一開始就爲實例創建列表,而不是intializing他們都:

ListCreator = int(input('Input how many lists are needed: ')) 
ListofLists = [[] for index in range(ListCreator)] 

還有更多的方法可以解決這個問題,但我不知道你的計劃是如何實施的引起它。

0

你可以簡單地做

import numpy as np 

def get_y_hat(y_bar, x_train, theta_Ridge_Matrix): 
    print theta_Ridge_Matrix.shape 
    print theta_Ridge_Matrix.shape[0] 
    yH = np.empty(theta_Ridge_Matrix.shape[0], theta_Ridge_Matrix[0].shape[0]) 
    for i in range(theta_Ridge_Matrix.shape[0]): 
     yH[i, :] = np.dot(x_train, theta_Ridge_Matrix[i].T) 
    print yH 

如果要存儲theta_Ridge_Matrix在三維陣列中,你也可以讓np.dot使用yH = np.dot(x_train, theta_Ridge_Matrix),這將總結在矩陣的倒數第二個層面做工作。

2

我認爲存儲從您的循環中的數據在dict和比它轉換爲pandas.Dataframe(這是建立在numpy的陣列的頂部)應是一個有效的解決方案,讓您進一步處理您的數據作爲整個或作爲單個載體。

作爲一個例子:

import pandas as pd 
import numpy as np 

data = {} 
# this would be your loop 
for i in range(50): 
    data['run_%02d' % i] = np.random.randn(50) 
data = pd.DataFrame(data) # sorted keys of the dict will be the columns 

可以訪問單個矢量作爲屬性或經由鍵:

print data['run_42'].describe() # or data.run_42.describe() 

count 50.000000 
mean  0.021426 
std  1.027607 
min  -2.472225 
25%  -0.601868 
50%  0.014949 
75%  0.641488 
max  2.391289 

或進一步分析整個數據:

print data.mean() 

run_00 -0.015224 
run_01 -0.006971 
.. 
run_48 -0.115935 
run_49 0.147738 

或有使用matplotlib查看您的數據(因爲您使用標記了您的問題):

data.boxplot(rot=90) 
plt.tight_layout() 

example_boxplot