2016-03-07 39 views
1

我有一個1000x784的數據矩陣(10000個示例和784個特徵),調用X_valid,我想將下列函數應用於此矩陣中的每一行並獲取數值結果:使用矢量化將函數應用於Numpy二維數組中的每一行

def predict_prob(x_valid, cov, mean, prior): 
    return -0.5 * (x_valid.T.dot(np.linalg.inv(cov)).dot(x_valid) + mean.T.dot(
    np.linalg.inv(cov)).dot(mean) + np.linalg.slogdet(cov)[1]) + np.log(
    prior) 

x_valid只是一行數據)。我使用numpy的的vectorize用下面的代碼來做到這一點:

v_predict_prob = np.vectorize(predict_prob) 
scores = v_predict_prob(X_valid, covariance[num], means[num], priors[num]) 

covariance[num]means[num]priors[num]只是常數。)

不過,我得到運行此當出現以下錯誤:

File "problem_5.py", line 48, in predict_prob 
return -0.5 * (x_valid.T.dot(np.linalg.inv(cov)).dot(x_valid) + mean.T.dot(np.linalg.inv(cov)).dot(mean) + np.linalg.slogdet(cov)[1]) + np.log(prior) 
AttributeError: 'numpy.float64' object has no attribute 'dot' 

也就是說,它不是單獨傳遞矩陣的每一行。相反,它傳遞給矩陣的每個條目(不是我想要的)。

我該如何改變這種情況以獲得所需的行爲?

回答

0

vectorize不是迭代一般的替代品,也沒有要求要快。它主要簡化對numpy廣播功能的訪問。通常,矢量化的函數將採用標量輸入,而不是行或1d數組。

我不認爲有配置vectorize將數組傳遞給你的函數,而不是一個項目的方式。

你描述x_valid爲2d,你想要逐行評估。而其他術語,如「」所選的「常量」。那些常數是什麼形狀?

您函數將大量的這些條款作爲二維數組:

x_valid.T.dot(np.linalg.inv(cov)).dot(x_valid) + 
mean.T.dot(np.linalg.inv(cov)).dot(mean) + 
np.linalg.slogdet(cov)[1]) + np.log(prior) 

x_valid.T是有意義的,只是如果x_valid是2D。如果是1d,則轉置會記錄。

np.linalg.inv(cov)只有在cov是2d時纔有意義。

mean.T.dot...假定mean爲2d。

np.linalg.slogdet(cov)[1]假定np.linalg.slogdet(cov)具有2個或更多個元件(或行)。

您需要向我們展示了功能與一些真正的陣列工作跳進迭代或「矢量化」之前。

相關問題