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])

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_46192930/article/details/106349915