numpy使用数组进行数据处理
Posted mengxiaoleng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了numpy使用数组进行数据处理相关的知识,希望对你有一定的参考价值。
numpy使用数组进行数据处理
meshgrid函数
理解:
二维坐标系中,X轴可以取三个值1,2,3, Y轴可以取三个值7,8, 请问可以获得多少个点的坐标?
显而易见是6个:
(1,7)(2,7)(3,7)
(1,8)(2,8)(3,8)
>>> import numpy as np#导入numpy
>>> a=np.array([1,2,3])#创建一维数组
>>> b=np.array([7,8])
>>> res=np.meshgrid(a,b)#获取所有点的横坐标和纵坐标
>>> res#返回list,有两个元素,第一个元素是X轴的取值,第二个元素是Y轴的取值
[array([[1, 2, 3],
[1, 2, 3]]), array([[7, 7, 7],
[8, 8, 8]])]
生成坐标绘制图像:
>>> import numpy as np
>>> points=np.arange(-5,5,0.01)#从-5到5步长为0.01
>>> xs,ys=np.meshgrid(points,points)
>>> 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]])
>>> z=np.sqrt(xs**2+ys**2)#函数的求值运算
>>> z
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]])
>>> import matplotlib.pyplot as plt
>>> plt.imshow(z, cmap=plt.cm.gray); plt.colorbar()
<matplotlib.image.AxesImage object at 0x00000000087D6EB8>
<matplotlib.colorbar.Colorbar object at 0x000000000D8F4FD0>
>>> plt.title("Image plot of $\\sqrtx^2 + y^2$ for a grid of values")
Text(0.5, 1.0, 'Image plot of $\\\\sqrtx^2 + y^2$ for a grid of values')
>>>plt.show()
将条件逻辑表述为数组运算
根据cond中的值来对数组进行选取,如果cond中的值为True,那么就选择x中对应的值,否则就选择y中对应的值,比如cond[0]=True,那么result[0]处应当放置yarr[0]的值
>>> 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) for x,y,c in zip(xarr,yarr,cond)]
>>> result
[1.1, 2.2, 1.3, 1.4, 2.5]
where方法
使用矢量
where方法可以取代上面的写法
>>> result=np.where(cond,xarr,yarr)
>>> result
array([1.1, 2.2, 1.3, 1.4, 2.5])
使用标量
np.where的第二个和第三个参数不必是数组,它们都可以是标量值。在数据分析工作中,where通常用于根据另一个数组而产生一个新的数组。假设有一个由随机数据组成的矩阵,你希望将所有正值替换为2,将所有负值替换为-2。若利用np.where,则会非常简单:
>>> arr=np.random.randn(4,4)
>>> arr
array([[-0.02461196, -0.11867552, 0.49004256, -0.25236766],
[ 1.66484493, -0.41180743, -0.34837293, -2.61422661],
[ 0.51476568, -0.41451909, 1.28553372, 0.13866799],
[-0.94795594, -1.49302099, 1.18480636, 0.20310613]])
>>> arr>0
array([[False, False, True, False],
[ True, False, False, False],
[ True, False, True, True],
[False, False, True, True]])
>>> np.where(arr>0,2,-2)
array([[-2, -2, 2, -2],
[ 2, -2, -2, -2],
[ 2, -2, 2, 2],
[-2, -2, 2, 2]])
标量矢量结合
如果对应位置是True,那么新的数组对应位置为2,否则就还是原来的数值
>>> np.where(arr>0,2,arr)
array([[-0.02461196, -0.11867552, 2. , -0.25236766],
[ 2. , -0.41180743, -0.34837293, -2.61422661],
[ 2. , -0.41451909, 2. , 2. ],
[-0.94795594, -1.49302099, 2. , 2. ]])
数学统计方法
mean函数
对所有的元素求均值
>>> import numpy as np
>>> arr=np.array([[1,2,3],[4,5,6],[7,8,9]])
>>> arr.mean()
5.0
>>> np.mean(arr)
5.0
sum函数
对所有元素求和
>>> arr.sum()
45
可选轴求值
>>> arr.mean(axis=1)#列求平均值
array([2., 5., 8.])
>>> arr.mean(axis=0)#行求平均值
array([4., 5., 6.])
>>> arr.sum(axis=0)
array([12, 15, 18])#行求和
>>> arr.sum(axis=1)
array([ 6, 15, 24])#列求和
cumsum函数
1.对于一维输入a(可以是list,可以是array,假设a=[1, 2, 3, 4, 5, 6, 7] ,就是当前列之前的和加到当前列上,如下:
>>>import numpy as np
>>> a=[1,2,3,4,5,6,7]
>>> np.cumsum(a)
array([ 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 75, 105])
2.对于二维输入a,axis=0(第1行不动,将第1行累加到其他行);axis=1(进入最内层,转化成列处理。第1列不动,将第1列累加到其他列),如下:
>>>import numpy as np
>>> c=[[1,2,3],[4,5,6],[7,8,9]]
>>> np.cumsum(c,axis=0)
array([[ 1, 2, 3],
[ 5, 7, 9],
[12, 15, 18]])
>>> np.cumsum(c,axis=1)
array([[ 1, 3, 6],
[ 4, 9, 15],
[ 7, 15, 24]])
cumprod函数
累乘方法同理
>>> arr.cumprod(axis=1)
array([[ 1, 2, 6],
[ 4, 20, 120],
[ 7, 56, 504]], dtype=int32)
以上是关于numpy使用数组进行数据处理的主要内容,如果未能解决你的问题,请参考以下文章
使用 c++ Eigen 库处理 numpy 数组后,输出错误