在上圖的compute_distances_two_loops() 函數中,我們需要實現計算每張測試圖像(如500張)與每張訓練圖像(如5000張)之間的L2距離,並返回一個500*5000的二維數組dists,dists[i,j]是第i張測試圖像與第j張訓練圖像之間的L2距離
我們有L2距離的計算公式如下:
即兩張圖像的L2距離等於他們每個對應像素值之差的平方的累加值開根號
dists[i][j] = np.sqrt(np.sum(np.square(X[i,:] - self.X_train[j,:])))
對上圖的計算語句,我們已知X是一個500 * 3072的數組,存儲了500張32 * 32 * 3的測試圖像
self.X_train是一個5000 * 3072的數組,存儲了5000張32 * 32 * 3的訓練圖像
上述語句是在內層循環中,即已經由i指明瞭一張測試圖像,以及j指明瞭一張訓練圖像,我們用這個語句計算測試圖像i與訓練圖像j之間的L2距離並將計算結果存儲在dists[i,j]中
ArraySlicing
要理解這個語句,我們首先要知道python中的數組切分Array Slicing,符號爲 冒號 :
一維數組中的切分
data[:] 輸出data中所有元素
data[start:end] 輸出data中下標【start,end-1】的元素
若冒號的左邊/右邊沒有指明數字下標,則取各自的界限值,即左邊補0/右邊補(數組長度-1)
又python中的負數下標-x理解爲(長度-x),故有
data[:-1] 爲輸出data中下標【0,(長度 - 1)- 1】的元素
二維數組中的切分
可由一維數組中的切分拓展而得
上圖中
np.sum(data1[0, :] + data2[0, :])
所做的事情是((1+9) + (2+8) + (3+7))
由此可見,只要公式中出現了求和符號∑,就可以調用np.sum()函數進行計算