利用数组进行数据处理
- np.meshgrid接受两个一维数组,并产生两个二维矩阵(对应两个数组中所有的(x,y)对)
# 计算 x**2 + y**2
import numpy as np
import matplotlib.pyplot as plt
points = np.arange(-5,5,0.1)
xs,ys = np.meshgrid(points,points)
z = np.sqrt(xs**2+ys**2)
将条件逻辑表述为数组运算
- np.where(condition,x,y) 函数是三元表达式 x if condition else y 的矢量化版本
- np.where()的第二个和第三个参数可以为数组或标量,大小可以不相等
- 在数据分析工作中,np.where()通常用于根据另一个数组产生一个新的数组
# 根据cond的值选取xarr和yarr的值
xarr = np.array([1.1, 1.2, 1.3, 1.4])
yarr = np.array([2.1, 2.2, 2.3, 2.4])
cond = np.array([True, False, True, True])
results = np.where(cond, xarr, yarr)
results # results = [(x if c else y) for x,c,y in zip(xarr, cond, yarr)]
# 将正值替换成1,负值替换成0
arr = np.random.randn(4,4)
result = np.where(arr > 0, 1, 0)
result
# 根据两个布尔型数组cond1和cond2的组合实现不同的赋值
cond1 = np.array([True, False, True, False, False])
cond2 = np.array([True, True, False, False, True])
# result3 = []
# for i in range(5):
# if cond1[i] and cond2[i]:
# result3.append(0)
# elif cond1[i]:
# result3.append(1)
# elif cond2[i]:
# result3.append(2):
# else:
# reault3.append(3)
result3 = np.where(cond1 & cond2,0,
np.where(cond1, 1, np.where(cond2, 2, 3)))
result3
# 布尔值在计算过程中可以被当作0或1处理
result4 = 1 * (cond1 ^cond2) + 2 * (cond2 & ~cond1) + 3 * ~(cond1|cond2)
result4
数学和统计方法
- sum、mean、标准差std等聚合计算(aggregation,也叫约简reduction),当作数组的实例方法调用arr.mean(),或当作NumPy函数使用np.mean()
- mean和sum这类函数可以接受一个axis参数(用于计算该轴向上的统计值),最终结果返回一个少一维的数组
- 其他如cumsum和cumprod之类的方法则不聚和,而是产生一个由中间结果组成的数组
arr = np.empty((4,4))
for i in range(4):
arr[i] = i
arr
基本数组统计方法
# 对数组中全部或某轴向的元素求和,零长度的数组sum为0
arr1 = arr.sum(1)
# 算术平均值,零长度数组mean值为NaN
arr2 = np.mean(arr,1)
# 标准差,自由度可调(默认为n)
arr3 = arr.std(0)
# 方差,自由度可调(默认为n)
arr4 = arr.var(0)
# 最大值
arr5 = arr.max()
# 最小值
arr6 = np.min(arr)
# 最大元素的索引
arr7 = arr.argmax()
# 最小元素的索引
arr8 = arr.argmin()
# 所有元素的累计和
arr9 = arr.cumsum()
# 所有元素的累计积
arr10 = arr.cumprod(1)
用于布尔型数组的方法
- 在统计方法中,布尔值会被强制转换为1(True)和0(False),sum可用于计数布尔型数组中的True值
- any方法用于测试数组中是否存在一个或多个True
- all检查数组中是否所有值都为True
# 计算正值的数量
arr = np.random.randn(100)
(arr>0).sum()
# any方法用于测试数组中是否存在一个或多个True,all检查数组中是否所有值都为True
bools = np.array([True, False, True])
bools.any()
bools.all()
any和all方法也可以用于非布尔型数组,非0的元素会被认为是True
排序
- sort方法,多维数组可以通过将轴编号传给sort,在任何一个轴上向上进行排序
- 顶级方法np.sort返回的是数组的已排序副本,而对实例本身调用sort方法则是对实例本身进行排序修改
- 计算数组分位数最简单的方法是对其进行排序,然后选取特定位置的值
# 排序
arr = np.random.randn(8)
arr.sort()
arr1 = np.random.randn(3,4)
arr1.sort(0)
# 计算 5%分位数
large_arr = np.random.randn(1000)
large_arr.sort()
large_arr[int(0.05*len(large_arr))]
数组的集合运算
# 找出数组中的唯一值,返回有序结果(相当于set)
arr1 = np.unique(arr)
# 计算x和y中的公共元素,返回有序结果
arr2 = np.intersect1d(xarr,yarr)
# 计算x和y的并集,返回有序结果
arr3 = np.union1d(xearr,yarr)
# 得到一个表示‘x的元素是否包含与y’的布尔型数组
arr4 = np.in1d(xarr,yarr)
# 集合的差,及元素在x中不在y中
arr5 = np.setdiff1d(xarr,yarry)
# 对称差(交集 - 并集)
arr6 = np.setxor1d(xarr,yarr)