numpy数组中行的前n个元素

use*_*737 2 python arrays numpy

我正在尝试在Python中实现k最近邻分类器,因此我想计算欧几里得距离。我有一个数据集,我已经将其转换为一个大的numpy数组

[[  0.   0.   4. ...,   1.   0.   1.]
 [  0.   0.   5. ...,   0.   0.   1.]
 [  0.   0.  14. ...,  16.   9.   1.]
 ..., 
 [  0.   0.   3. ...,   2.   0.   3.]
 [  0.   1.   7. ...,   0.   0.   3.]
 [  0.   2.  10. ...,   0.   0.   3.]]
Run Code Online (Sandbox Code Playgroud)

每行的最后一个元素指示类。因此,在计算欧几里得距离时,我显然不想包含最后一个元素。我以为我可以做到以下几点

for row in dataset:
    distance = euclidean_distance(vector, row[:dataset.shape[1] - 1])
Run Code Online (Sandbox Code Playgroud)

但这仍然包括最后一个元素

print row
>>> [[  0.   0.   4. ...,   1.   0.   1.]]
print row[:dataset.shape[1] - 1]
>>> [[  0.   0.   4. ...,   1.   0.   1.]]
Run Code Online (Sandbox Code Playgroud)

如您所见,两者是相同的。

Jam*_*mes 5

您可以使用numpy切片对数据进行子集化。如果发现自己遍历numpy数组,请停止并尝试找到一种利用numpy操作的矢量化性质的方法。

假设您的数组称为arr

data_points = arr[:,:-1]
classes = arr[:,-1]
Run Code Online (Sandbox Code Playgroud)

对于矢量计算的距离:

要查找一维数组与二维数组所有行之间的距离,可以使用以下方法。假设1d数组为v,2d数组为arr

dist = np.power(arr - v, 2).sum(axis=1)
Run Code Online (Sandbox Code Playgroud)

dist 将是一维距离数组。


对于成对计算:

以下函数采用2d数字数组,并使用给定的Lx距离度量(欧几里得距离度量为L = 2度量)返回成对距离的上对角矩阵。

def pairwise_distance(arr, L=2):
    d = arr.shape[0]
    out = np.zeros(d)
    for f in range(1, d):
        out[:-f].ravel()[f::d+1] = np.power(arr[:-f]-arr[f:], L).sum(axis=1)
    return np.power(out, 1.0/L)
Run Code Online (Sandbox Code Playgroud)