NumPy基础:使用数组进行面向数组编程,将条件逻辑作为数组操作,数学和统计方法,布尔值数组方法,排序,唯一值与其他集合逻辑
使用数组进行面向数组编程
使用 Numpy 数组可以使你利用简单的数组表达式完成多种数据操作任务,而不需写大量循环。这种利用数组表达式来代替显示循环的方法,称为向量化。通常向量化的数组操作比单纯的python等价实现的速度开很多很多。。。
作为一个简单的示例,假如我们像对一些网格数据来计算函数 sqrt(x**2+y**2)。np.meshgrid 函数接受两个一维数组,并根据两个数组所有(x,y)对生成一个二维矩阵。。。。可以这么理解,meshgrid函数用两个坐标轴上的点在平面上画网格
arr1 = np.array([0,1,2])
arr2 = np.array([9,8,7,6,5])
arr_list = np.meshgrid(arr1,arr2)
arr_list
[array([[0, 1, 2],
[0, 1, 2],
[0, 1, 2],
[0, 1, 2],
[0, 1, 2]]),
array([[9, 9, 9],
[8, 8, 8],
[7, 7, 7],
[6, 6, 6],
[5, 5, 5]])]
x,y = np.meshgrid(arr1,arr2)
z=np.sqrt(x**2 + y**2)
print(z)
[[9. 9.05538514 9.21954446]
[8. 8.06225775 8.24621125]
[7. 7.07106781 7.28010989]
[6. 6.08276253 6.32455532]
[5. 5.09901951 5.38516481]]
额。。。就是类似这种感觉吧。。。。灵魂画手。。。。
提前体验一下使用 matplotlib 来生成这个二维数组的可视化。哼,,,跟我画的差不多嘛。。。
将条件逻辑作为数组操作
numpy.where 函数是三元表达式 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])
# 假设cond 中的元素为True 我们取xarr 中的元素,否则取yarr
result = np.where(cond,xarr,yarr)
print(result)
[1.1 2.2 1.3 1.4 2.5]
np.where 的第二个第三个参数并不需要数组,他们可以是标量。where 再数据分析中的一个典型用法就是根据一个数组生成一个新的数组。。例如,你有一个随机生成的矩阵数据,并且你想将其中的正值替换成 2.
arr = np.random.randn(4,4)
np.where(arr>0,2,-2)
array([[-1.22481618, -0.7539684 , -0.01199504, -1.4227693 ],
[ 2. , -0.21933428, -0.51534113, -0.8234997 ],
[ 2. , -0.61133548, -1.62895425, 2. ],
[-0.20999868, 2. , -0.0072166 , 2. ]])
传递给np.where 的数组既可以是同等大小的数组,也可以是标量。
数学和统计方法
许多关于计算整个数组统计值或关于轴向数据的数学函数,可以作为数组类型的方法被调用。你可以使用聚合函数(也叫缩减函数),比如 sum,mean(平均值),std(标准差),可以直接调用数组实例的方法,可以使用顶层的numpy 函数:
arr = np.random.randn(5,4)
print(arr.mean())
print(np.mean(arr))
-0.012492895316118507
-0.012492895316118507
# 这些函数接受一个可选参数 axis ,用于计算给定轴上的统计值,形成一个下降一维度的数组
print(arr.mean(axis=1)) # 计算每一列的平均值
print(arr.sum(axis=0)) # 计算行轴向的和
[-0.32510074 -0.53486786 -0.22399905 0.99351569 0.13597683]
[-0.94600857 1.72458595 -1.10133876 0.50486085]
在多维数组中,像 cumsum 这样的累积函数返回相同长度的数组,但是可以在指定轴向上根据较低维度的切片进行部分聚合。。。怎么这么文邹邹的呢。。。。
arr = np.array([[0,1,2],[3,4,5],[6,7,8]])
arr.cumsum()
array([ 0, 1, 3, 6, 10, 15, 21, 28, 36], dtype=int32) # 返回一位数组
arr.cumsum(axis=0)
array([[ 0, 1, 2], # 逐行累加
[ 3, 5, 7],
[ 9, 12, 15]], dtype=int32)
布尔值数组的方法
布尔值强制为1 或 0.因此可以使用sum 计算布尔值数组中 True 的个数。
对于布尔值数组,有两个非常有用的方法 any 和 all 。any 检查数组中是否至少有一个为 True,all 检查是否每个都是 True.
bool = np.array([False,False,True,False])
print(bool.sum(),bool.any(),bool.all())
1 True False
排序
Numpy 数组可以使用sort 来排序:
arr = np.random.randn(5,3)
arr
array([[-1.11867822, -1.45739585, -0.43883995],
[-0.5491658 , -1.05785397, 0.56265271],
[ 0.59706381, 0.25841734, 0.39825204],
[-0.79154983, -1.34942813, -1.14551337],
[-0.80111967, 0.58706369, -0.89560696]])
arr.sort(axis=1) # 这跟直接 sort() 结果一样啊。。。。不是说沿轴向对每一个一维数据段进行排序嘛
arr
array([[-1.45739585, -1.11867822, -0.43883995],
[-1.05785397, -0.5491658 , 0.56265271],
[ 0.25841734, 0.39825204, 0.59706381],
[-1.34942813, -1.14551337, -0.79154983],
[-0.89560696, -0.80111967, 0.58706369]])
顶层的 np.sort() 方法返回的是已经排好顺序的数组拷贝,而不是对原数组按位置进行排序。更高级的排序,待 pandas。。。
唯一值与其他集合逻辑
numpy 包含一些针对一维 ndarray 的基础集合操作。常用 np.unique 返回数组中唯一值排序后形成的数组:
ints = np.array([2,2,1,1,1,5,4,4,4,3,8,7,7])
np.unique(ints)
array([1, 2, 3, 4, 5, 7, 8])
np.in1d(ints,[1,2,4,6]) # 检查一个数组中的值是否在另一个数组中,返回布尔值数组
array([ True, True, True, True, True, False, True, True, True,
False, False, False, False])