如果我们想在一组sqrt(x^2+y^2),便可以使用meshgrid函数。它接收两个以为数组,产生两个二维矩阵,如下:
>>> points = np.arange(-5,5,0.01)
>>> xs,ys = np.meshgrid(points,points)#代表要计算的x,y值
>>> xs
array([[-5. , -4.99, -4.98, ..., 4.97, 4.98, 4.99],
[-5. , -4.99, -4.98, ..., 4.97, 4.98, 4.99],
[-5. , -4.99, -4.98, ..., 4.97, 4.98, 4.99],
...,
[-5. , -4.99, -4.98, ..., 4.97, 4.98, 4.99],
[-5. , -4.99, -4.98, ..., 4.97, 4.98, 4.99],
[-5. , -4.99, -4.98, ..., 4.97, 4.98, 4.99]])
>>> ys
array([[-5. , -5. , -5. , ..., -5. , -5. , -5. ],
[-4.99, -4.99, -4.99, ..., -4.99, -4.99, -4.99],
[-4.98, -4.98, -4.98, ..., -4.98, -4.98, -4.98],
...,
[ 4.97, 4.97, 4.97, ..., 4.97, 4.97, 4.97],
[ 4.98, 4.98, 4.98, ..., 4.98, 4.98, 4.98],
[ 4.99, 4.99, 4.99, ..., 4.99, 4.99, 4.99]])
接下来像计算两个实数一样计算它们的值就可以了,如下:
>>> np.sqrt(xs**2+ys**2)
array([[ 7.07106781, 7.06400028, 7.05693985, ..., 7.04988652,
7.05693985, 7.06400028],
[ 7.06400028, 7.05692568, 7.04985815, ..., 7.04279774,
7.04985815, 7.05692568],
[ 7.05693985, 7.04985815, 7.04278354, ..., 7.03571603,
7.04278354, 7.04985815],
...,
[ 7.04988652, 7.04279774, 7.03571603, ..., 7.0286414 ,
7.03571603, 7.04279774],
[ 7.05693985, 7.04985815, 7.04278354, ..., 7.03571603,
7.04278354, 7.04985815],
[ 7.06400028, 7.05692568, 7.04985815, ..., 7.04279774,
7.04985815, 7.05692568]])
使用where函数或者x if condition else y可以根据条件选取值,其中where函数x if condition else y的矢量版本。
x if condition else y的用法:
>>> xarr = np.array([1.1,1.2,1.3,1.4,1.5])
>>> yarr = np.array([2.1,2.2,2.3,2.4,2.5])
>>> cond = np.array([True,False,True,True,False])
>>> result = [(x if c else y)]
>>> result = [(x if c else y) for x,y,c in zip(xarr,yarr,cond)]
>>> result
[1.1000000000000001, 2.2000000000000002, 1.3, 1.3999999999999999, 2.5]
where的用法:
>>> result = np.where(cond,xarr,yarr)
>>> result
array([ 1.1, 2.2, 1.3, 1.4, 2.5])
第二和第三个参数不必是数组,它们都可以是标量,也可以省略,比如:
>>> a=np.arange(15).reshape(3,5)
>>> np.where(a>5,1,-1)#大于5的数全部置为1,小于5的数置为-1
array([[-1, -1, -1, -1, -1],
[-1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1]])
可以通过数组上的一组数学函数对整个数组或某个轴向的数据进行统计计算。包括sum、mean以及标准差std等函数。
>>> arr = np.random.randn(5,4)
>>> arr
array([[-0.93836962, 0.38506353, -0.61461464, -1.75187982],
[-1.07569661, 1.34323116, -1.59359379, 0.05896282],
[ 0.7042585 , -1.09405091, 1.95287523, 1.82780583],
[-0.45911949, 1.21783708, -0.5824492 , -3.97907432],
[-0.48058905, 3.31623368, -1.55382586, -0.85738129]])
>>> arr.mean()#求平均值
-0.20871883850830381
>>> arr.sum()#求和
-4.1743767701660763
>>> np.sum(arr)#另一种写法
-4.1743767701660763
>>> arr.mean(axis=1)#计算轴向上的统计值
array([-0.72995014, -0.31677411, 0.84772216, -0.95070148, 0.10610937])
>>> arr.sum(axis=1)
array([-2.91980055, -1.26709643, 3.39088865, -3.80280594, 0.42443749])
>>> arr = np.random.randn(100)
>>> (arr>0).sum() #判断正值的数量
45
基本数组统计方法:
使用unique函数可以找出数组中的唯一值并返回排序后的结果,如下:
>>> arr = np.array(['Bob','Curry','LBJ','james','Bob','Durant','love','james'])
>>> np.unique(arr)
array(['Bob', 'Curry', 'Durant', 'LBJ', 'james', 'love'],
dtype='|S6')
不过使用纯Python实现也不复杂:
>>> sorted(set(arr))
['Bob', 'Curry', 'Durant', 'LBJ', 'james', 'love']
使用In1d(中间的确实是1不是l,这个函数的命名挺奇怪)函数可以判断一个数组中的元素是否在另一个数组中:
>>> values = np.array([6,0,0,3,2,5,6])
>>> np.in1d(values,[2,3,6]) #
array([ True, False, False, True, True, False, True], dtype=bool)
其他的一些数组集合运算的函数:
save和load函数是文件存取的主要函数,默认情况下是以二进制的形式存储在拓展名为.npy的文件中:
>>> arr = np.arange(10)
>>> np.save('array',arr)
>>> np.load('array.npy')#如果没有拓展名,自动加上.npy
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
默认存储路径为C:\Users\Administrator,由于是以二进制形式存储,所以直接打开只会看到一些数字。
>>> arr1
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> arr2
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> np.savez('array1',a=arr1,b=arr2)
>>> res = np.load('array1.npz')#npz为后缀名
>>> res['a']
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> res['b']
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
获取存储多个数组的文件时会采用延时加载,即当调用时才去加载。
使用savetxt和loadtxt可以将文件存取为文本文件:
>>> np.savetxt('array.txt',arr1)
>>> np.loadtxt('array.txt')
array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])
矩阵相乘:
>>> x
array([[2, 3, 4],
[5, 6, 7]])
>>> y
array([[1, 2],
[2, 3],
[3, 4]])
>>> x.dot(y)
array([[20, 29],
[38, 56]])
>>> np.dot(x,y) #两种调用方法
array([[20, 29],
[38, 56]])
常用线性代数函数
参考:
《利用python进行数分析》