2016-11-10 478 views
0

我對Python(以前的Matlab用戶)很新。python填充數組中的元素

我有陣列

y_pred = [None] * 128 

test_idx是的indeces

array([ 3, 4, 5, 19, 28, 30, 38, 39, 47, 49, 50, 51, 54, 
     64, 74, 81, 84, 85, 90, 91, 93, 97, 102, 103, 106, 107, 
     109, 111, 115, 121], dtype=int64) 

我想更換y_pred對應於test_idx與陣列results

array([0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 
     0, 0, 0, 0, 0, 0, 0]) 
的值的數組

如果我試試

y_pred[test_idx] = results 

我得到的錯誤: 類型錯誤:只有一個元素整數數組可以被轉換成一個指數

+2

'y_pred'不是一個數組,而是一個'list',它不能像那樣索引。也許使用數組呢? –

+2

另外,你應該真的使用'numpy'標籤,你會問'numpy'數組的問題。 –

+0

你真的想把'y_pred''列爲'None'嗎?不是零的數組?什麼是Matlab的等價物? – hpaulj

回答

0

簡短版本:用y_pred = np.full(128, np.NaN)替換y_pred = [None] * 128。一旦你做到了,其他的一切都會奏效。

龍版本:

如其他人所說的問題,是y_pred是一個列表,而不是一個數組。列表不支持一次獲取或設置多個索引,您需要爲此使用一個numpy數組。

最簡單的方法就是使用所謂的「哨兵」值的一個numpy數組,該數值表示沒有寫入任何內容。這個值最明顯的選擇可能是0NaN,但取決於你想要對結果做什麼,它可能只是關於任何事情。 NaN是指向None的壁櫥,您將獲得一個數字numpy數組,但0可以使一些稍後的計算更容易(例如NaN != NaN,您需要使用np.isnan以確定NaN值)。

要做到這一點與零,你可以用y_pred = np.zeros(128)替換y_pred = [None] * 128。要使用NaN(或任何其他值),您可以使用y_pred = np.full(128, np.NaN)(也有一個np.ones,但我認爲它不會幫助你在這裏)。其餘的代碼可以按原樣使用。

1

y_pred是土生土長的Python列表,你可以不通過不是整數的任何其他指標它。你應該創建它作爲一個numpy數組。

嘗試初始化它下面的方法:我看到你在這裏做了很多MATLAB的

import numpy as np 
y_pred = np.array([None] * 128) 
+3

你必須仔細考慮是否使用'None',它會強制'y_pred'具有'object' dtype,這會殺死性能。 –

+0

好點,但問題是關於運行時錯誤 – pt12lol

+2

是真的,但它是一個值得一提的考慮,特別是如果OP是python/numpy的新手。 –

1

;)

如果你想這樣做的Python的方式!你需要循環。 像:

for index, value in zip(test_idx, results): 
    y_pred[index] = value 
+0

這是正確的列表方法。 – hpaulj

0

,你可以做這樣的:

for i in xrange(len(test_idx)): 
    y_pred[test_idx[i]] = results[i] 

或:

for key, val in zip(test_idx, results): 
    y_pred[key] = val 

我假設你的兩個列表具有相同的長度。