一、向量是什么
在数学中,向量(也称为欧几里得向量、几何向量、矢量),指具有大小(magnitude)和方向的量。它可以形象化地表示为带箭头的线段。箭头所指:代表向量的方向;线段长度:代表向量的大小。与向量对应的只有大小,没有方向的量叫做数量(物理学中称标量)
在这里,向量即一维数组,用 arange 函数创建向量是最简单的方式之一:
arange函数也可以指定初始值、终止值和步长来创建一维数组:
向量还能直接对每个元素进行运算:
二、创建向量
上面使用 arange 则是创建向量的一种方式,其实只要是数组创建的函数均可以创建向量,如:
linspace() 函数
前文介绍:linspace 通过制定初始值、终止值和元素个数创建等差数列向量,通过endpoint 参数指定是否包含终止值,默认为True
logspace() 函数
同linspace,创建等比数列,基数通过base参数指定,默认基数为10
zeros() 函数和 ones() 函数
这两个函数分别可以创建指定长度或形状的全0或全1的 ndarray 数组,比如:
指定数据类型:
empty() 函数
这个函数可以创建一个没有任何具体值的 ndarray 数组,例如:
random.randn() 函数
randn 是 numpy.random 中生成正态分布随机数据的函数
fromstring() 函数
从字符串创建数组
上面从字符串创建的数组,定义为整形8bit,创建出来的其实就是字符串的ASCII 码
fromfunction() 函数
从函数创建数组,是数据分析常见的方法
可先定义一个从下标计算数值的函数,然后用fromfunction 创建数组
fromfunction 第一个参数为计算每个数组元素的函数名,第二个参数指定数组的形状。因为它支持多维数组,所以第二个参数必须是一个序列。
例如我创建一个九九乘法表:
注意,fromfunction 函数中的第二个参数指定的是数组的下标,下标作为实参通过遍历的方式传递给函数的形参。
众多python培训视频,尽在python学习网,欢迎在线学习!
在很多算法中都会涉及到求向量欧式距离,例如机器学习中的KNN算法,就需要对由训练集A和测试集B中的向量组成的所有有序对(Ai,Bi),求出Ai和Bi的欧式距离。这样的话就会带来一个二重的嵌套循环,在向量集很大时效率不高。这里介绍如何将这一过程用矩阵运算实现。
假设有两个三维向量集,用矩阵表示:
A=[a11a12a21a22a31a32]
B=⎡⎣⎢⎢b11b12b13b21b22b23b31b32b33⎤⎦⎥⎥
要求A,B两个集合中的元素两两间欧氏距离。
先求出ABT:
ABT=⎡⎣⎢⎢⎢⎢⎢∑k=13ak1bk1∑k=13ak2bk1∑k=13ak1bk2∑k=13ak2bk2∑k=13ak1bk3∑k=13ak2bk3⎤⎦⎥⎥⎥⎥⎥
然后对A和BT分别求其中每个向量的模平方,并扩展为2*3矩阵:
Asq=⎡⎣⎢⎢⎢⎢⎢∑k=13(ak1)2∑k=13(ak2)2∑k=13(ak1)2∑k=13(ak2)2∑k=13(ak1)2∑k=13(ak2)2⎤⎦⎥⎥⎥⎥⎥
Bsq=⎡⎣⎢⎢⎢⎢⎢∑k=13(bk1)2∑k=13(bk1)2∑k=13(bk2)2∑k=13(bk2)2∑k=13(bk3)2∑k=13(bk3)2⎤⎦⎥⎥⎥⎥⎥
然后:
Asq+Bsq−2ABT=⎡⎣⎢⎢⎢⎢⎢∑k=13(ak1−bk1)2∑k=13(ak2−bk1)2∑k=13(ak1−bk2)2∑k=13(ak2−bk2)2∑k=13(ak1−bk3)2∑k=13(ak2−bk3)2⎤⎦⎥⎥⎥⎥⎥
将上面这个矩阵一开平方,就得到了A,B向量集两两间的欧式距离了。
下面是Python实现:
import numpy
def EuclideanDistances(A, B):
BT = B.transpose()
vecProd = A * BT
SqA = A.getA()**2
sumSqA = numpy.matrix(numpy.sum(SqA, axis=1))
sumSqAEx = numpy.tile(sumSqA.transpose(), (1, vecProd.shape[1]))
SqB = B.getA()**2
sumSqB = numpy.sum(SqB, axis=1)
sumSqBEx = numpy.tile(sumSqB, (vecProd.shape[0], 1))
SqED = sumSqBEx + sumSqAEx - 2*vecProd
ED = (SqED.getA())**0.5
return numpy.matrix(ED)
不看numpy一维数组的话,就是len相同的一个列表相同索引值相加吧。
x1=[1,2,3]
x2=[4,5,6]
x3=[]
def add():
for i in range(0,len(x1)):
x3.append(x1[i]+x2[i])
return x3
print(add())