Python/scipy spatial data

来自菜鸟教程
跳转至:导航、​搜索

<languages />

科学空间数据

处理空间数据

空间数据是指在几何空间中表示的数据。

E.g.点在坐标系上。

我们处理许多任务上的空间数据问题。

E.g.查找一个点是否在边界内。

SciPy为我们提供了模块 scipy.spatial ,该功能具有处理空间数据的功能。

三角剖分

多边形的三角剖分是将多边形分成多个三角形,我们可以使用它们来计算多边形的面积。

三角剖分 with points 表示创建曲面组成的三角形,其中所有给定点都位于曲面中任何三角形的至少一个顶点上。

通过点生成这些三角剖分的一种方法是 Delaunay() 三角剖分。

从以下几点创建三角剖分:

import numpy as np

from scipy.spatial import Delaunay

import matplotlib.pyplot as plt



points = np.array([

  [2, 4],

  [3, 4],

  [3, 0],

  [2, 2],

  [4, 1]

])



simplices = Delaunay(points).simplices



plt.triplot(points[:, 0], points[:, 1], simplices)

plt.scatter(points[:, 0], points[:, 1], color='r')



plt.show()

结果:

文件:Scipy spatial delaunay.png


注意: The simplices 属性创建三角形符号的概括。


凸包

凸包是覆盖所有给定点的最小多边形。

使用 ConvexHull() 创建凸包的方法。

为以下几点创建凸包:

import numpy as np

from scipy.spatial import ConvexHull

import matplotlib.pyplot as plt



points = np.array([

  [2, 4],

  [3, 4],

  [3, 0],

  [2, 2],

  [4, 1],

  [1, 2],

  [5, 0],

  [3, 1],

  [1, 2],

  [0, 2]

])



hull = ConvexHull(points)

hull_points = hull.simplices



plt.scatter(points[:,0], points[:,1])

for simplex in hull_points:

  plt.plot(points[simplex,0], points[simplex,1], 'k-')



plt.show()

结果:

文件:Scipy spatial convexhull.png


KD树

KDTree是为最近邻居查询优化的数据结构。

E.g.在使用KDTree的一组点中,我们可以有效地询问哪些点最接近某个给定点。

The KDTree() 方法返回一个KDTree对象。

The query() 方法将距离返回到最近的邻居 and 邻居的位置。

找到最近的邻居指向(1,1):

from scipy.spatial import KDTree



points = [(1, -1), (2, 3), (-2, 3), (2, -3)]



kdtree = KDTree(points)



res = kdtree.query((1, 1))



print(res)

结果:

 (2.0, 0)

距离矩阵

在数据科学中,有许多距离度量用于查找两点之间的各种类型的距离,例如欧几里得距离,余弦距离等。

两个向量之间的距离不仅可以是它们之间的直线长度,还可以是它们之间的原点角度或所需的单位步长等。

机器学习算法的许多性能在很大程度上取决于距离度量。E.g.“ K个最近邻居”或“ K个均值”等。

让我们看一些距离度量:

欧几里德距离

找到给定点之间的欧几里得距离。

from scipy.spatial.distance import euclidean



p1 = (1, 0)

p2 = (10, 2)



res = euclidean(p1, p2)



print(res)

结果:

 9.21954445729

街区距离(曼哈顿距离)

是使用4度移动量计算的距离。

E.g.我们只能移动:向上,向下,向右或向左移动,不能对角线移动。

找到给定点之间的街区距离:

from scipy.spatial.distance import cityblock



p1 = (1, 0)

p2 = (10, 2)



res = cityblock(p1, p2)



print(res)

结果:

 11

余弦距离

是两个点A和B之间的余弦角值。

找到给定点之间的余弦距离:

from scipy.spatial.distance import cosine



p1 = (1, 0)

p2 = (10, 2)



res = cosine(p1, p2)



print(res)

结果:

 0.019419324309079777

汉明距离

是两个比特不同的比特比例。

这是一种测量二进制序列距离的方法。

找到给定点之间的汉明距离:

from scipy.spatial.distance import hamming



p1 = (True, False, True)

p2 = (False, True, True)



res = hamming(p1, p2)



print(res)

结果:

 0.666666666667