2016-12-05 67 views
0

我有數組的數組:通過元件插入一個列表,元素,成陣列的陣列中的元素

parameters = [np.array([ 2.1e-04, -8.3e-03, 9.8e-01]), np.array([ 5.5e-04, 1.2e-01, 9.9e-01]), ...] 

,其長度:

print len(parameters) 

100  

如果我們的標籤的元素parameters作爲parameters[i][j]

則有可能訪問每個數量,即print parameters[1][2]給出0.99

我也有一個陣列:

temperatures = [110.51, 1618.079, ...] 

,其長度也100

print len(temperatures) 

100  

讓的temperatures元素是k

我想插入的每個k th元素將temperatures分成parameters的每個i個元素,以便獲得final

final = [np.array([ 2.1e-04, -8.3e-03, 9.8e-01, 110.51]), np.array([ 5.5e-04, 1.2e-01, 9.9e-01, 1618.079]), ...] 

我曾試圖使像一個zip循環:

for i,j in zip(parameters, valid_temperatures): final = parameters[2][i].append(valid_temperatures[j])

但這不起作用。如果你能幫助我,我將不勝感激。

編輯:基於@hpaulj答案:

如果運行解決方案1 ​​

parameters = [np.array([ 2.1e-04, -8.3e-03, 9.8e-01]), np.array([ 5.5e-04, 1.2e-01, 9.9e-01])] 
temperatures = [110.51, 1618.079] 

    for i,(arr,t) in enumerate(zip(parameters,temperatures)): 
    parameters[i] = np.append(arr,t) 

print parameters 

它提供:

[array([ 2.10000000e-04, -8.30000000e-03, 9.80000000e-01, 
    1.10510000e+02]), array([ 5.50000000e-04, 1.20000000e-01, 9.90000000e-01, 
    1.61807900e+03])] 

這是所需的輸出。

此外,溶液2

parameters = [np.array([ 2.1e-04, -8.3e-03, 9.8e-01]), np.array([ 5.5e-04, 1.2e-01, 9.9e-01])] 
temperatures = [110.51, 1618.079] 

parameters = [np.append(arr,t) for arr, t in zip(parameters,temperatures)] 

print parameters 

也給出了期望的輸出。

與之相對溶液1溶液2不使用第i索引enumerate。因此,如果我剛分割溶液2[np.append ... for arr ]語法如下方式:

parameters = [np.array([ 2.1e-04, -8.3e-03, 9.8e-01]), np.array([ 5.5e-04, 1.2e-01, 9.9e-01])] 
temperatures = [110.51, 1618.079] 

for arr, t in zip(parameters,temperatures): 
    parameters = np.append(arr,t) 

print parameters 

輸出僅包含最後一次迭代,而不是在‘陣列格式’:

[ 5.50000000e-04 1.20000000e-01 9.90000000e-01 1.61807900e+03] 

如何通過打印所有的迭代來實現這個功能? 感謝

+0

你有陣列的*列表* ...然後下的*列表*。 –

+0

可能'parameters [i] =參數[i] .append(溫度[i])''。這應該附加'溫度'的第i個元素到'參數'中的元素# –

+0

@ArturRychlewicz不,它不會,因爲'列表!= np.array' –

回答

3

你有陣列的列表,以及另一個列表或數組:

In [656]: parameters = [np.array([1,2,3]) for _ in range(5)] 
In [657]: temps=np.arange(5) 

結合他們只是通過迭代(列表解析工作正常爲),並執行concatenate(陣列追加)爲每一對。

In [659]: [np.concatenate((arr,[t])) for arr, t in zip(parameters, temps)] 
Out[659]: 
[array([1, 2, 3, 0]), 
array([1, 2, 3, 1]), 
array([1, 2, 3, 2]), 
array([1, 2, 3, 3]), 
array([1, 2, 3, 4])] 

append爲我們節省2對[]使用,否則是相同的:

[np.append(arr,t) for arr, t in zip(parameters,temps)] 

乾淨 '就地' 版本:

for i,(arr,t) in enumerate(zip(parameters,temps)): 
    parameters[i] = np.append(arr,t) 

==== ============

如果子陣列的長度都相同,則可以將parameters成一個二維數組,並連接所有的temps

In [663]: np.hstack((np.vstack(parameters),temps[:,None])) 
Out[663]: 
array([[1, 2, 3, 0], 
     [1, 2, 3, 1], 
     [1, 2, 3, 2], 
     [1, 2, 3, 3], 
     [1, 2, 3, 4]]) 
+0

好吧,你反正在創建新的數組。這將有助於指出,這是對'numpy'數據結構的糟糕使用。 –

+0

時間的低效並不是真正歸因於列表理解,而是np.array被用於可能普通的Python列表的地方。 –

+1

如果您從列表開始,那麼堅持使用列表操作通常會更快。創建一個數組有很大的開銷。我們必須對現實數據進行計時,以確定哪個數據更快。 – hpaulj