numpy数组中行的前n个元素

时间:2016-12-01 13:48:57

标签: 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.]]

其中每行的最后一个元素表示该类。所以在计算欧氏距离时,我显然不想包含最后一个元素。我以为我可以做以下事情

for row in dataset:
    distance = euclidean_distance(vector, row[:dataset.shape[1] - 1])

但仍然包含最后一个元素

print row
>>> [[  0.   0.   4. ...,   1.   0.   1.]]
print row[:dataset.shape[1] - 1]
>>> [[  0.   0.   4. ...,   1.   0.   1.]]

你可以看到两者都是一样的。

1 个答案:

答案 0 :(得分:5)

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

假设您的数组名为arr

data_points = arr[:,:-1]
classes = arr[:,-1]

距离矢量计算:

要查找1d数组与2d数组的所有行之间的距离,您可以使用以下内容。假设1d数组为v,而2d数组为arr

dist = np.power(arr - v, 2).sum(axis=1)

dist将是一维距离数组。

对于成对计算:

以下函数采用2d数字数组,并使用给定的L-x距离测量返回成对距离的上对角矩阵(欧几里德距离度量是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)