利用数组进行数据处理
Part 1
numpy数组使你可以将许多数据处理任务表述为间接的数组表达式(否则需要编写循环)。用数组表达式代替循环的做法,通常被称为矢量化。一般来说,矢量化数组运算要比等价的纯python方式要快上一两个数量级(甚至更多),尤其是各种数值计算。
import numpy as np points = np.arange(-5,5,0.01)
x,y = np.meshgrid(points,points)
y
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]])
import matplotlib.pyplot as plt
z = np.sqrt(x**2+y**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]])
plt.title('Image plot of $\sqrt{x^2+y^2}$ for a grid of values') plt.imshow(z,cmap=plt.cm.gray);plt.colorbar()
Part 2
将条件逻辑表述为数组运算
numpy.where 是三元表达式的矢量化版本。
官方文档:https://docs.scipy.org/doc/numpy/reference/generated/numpy.where.html
In [1]: import numpy as np In [2]: xarr = np.array([1.1,1.2,1.3]) In [3]: yarr = np.array([2.1,2.2,2.3]) In [4]: cond = np.array([True,False,True]) In [5]: result = np.where(cond,xarr,yarr) In [6]: result Out[6]: array([1.1, 2.2, 1.3])
np.where的第二个和第三个参数不必是数组。它们都可以是标量值。在数据分析工作中,where通常用于根据另一个数组而产生一个新的数组。
假设有一个由随机数据组成的矩阵。你希望将所有正值替换为2,将所有负值替换为-2。利用np.where,则会非常简单。
arr = randn(4,4)
arr
array([[-3.54522971, 1.68063071, 1.1204201 , 1.13209986], [ 0.40560108, -0.25336595, 0.32044861, -1.39082664], [ 0.2424607 , 1.24353322, -2.02133435, -0.60433901], [-0.82997538, 1.00716739, 0.37567233, 0.90534339]])
numpy.where(arr>0,2,-2)
array([[-2, 2, 2, 2], [ 2, -2, 2, -2], [ 2, 2, -2, -2], [-2, 2, 2, 2]])
Part 3
唯一化以及其它的集合逻辑
unique(x) 计算x中的唯一元素,并返回有序结果
In [1]: import numpy as np In [2]: np.unique(np.array([1,3,4,3])) Out[2]: array([1, 3, 4])
intersect1d(x,y) 计算 x 和 y 中的公共元素,并返回有序结果
In [4]: np.intersect1d(np.array([1,2,3]),np.array([2,3,4])) Out[4]: array([2, 3])
union1d(x,y)
In [5]: np.union1d(np.array([1,2,3]),np.array([2,3,4])) Out[5]: array([1, 2, 3, 4])
in1d(x,y) 得到一个表示 x 的元素是否包含于 y 的布尔型数组
In [6]: np.in1d(np.array([1,2,3]),np.array([2,3,4])) Out[6]: array([False, True, True])
setdiff1d(x,y) 集合的差,即元素在 x 中且不再 y 中
In [7]: np.setdiff1d(np.array([1,2,3]),np.array([2,3,4])) Out[7]: array([1])
setxor1d(x,y) 集合的对称差,即存在于一个数组中,但不同时存在于两个数组中的元素。简单来说,就是“异或”
In [8]: np.setxor1d(np.array([1,2,3]),np.array([2,3,4])) Out[8]: array([1, 4])