美文网首页
NumPy辟邪剑谱——进阶篇

NumPy辟邪剑谱——进阶篇

作者: 转身丶即天涯 | 来源:发表于2019-11-10 21:35 被阅读0次

    前言

    这里是Numpy辟邪剑谱进阶篇,之前还有一篇入门篇,没看的同学可以点传送门:NumPy辟邪剑谱——入门篇

    再次声明,以下内容大多来自《利用python进行数据分析》一书,非常值得拥有的一本书。


    1.bool过滤

    # 1. bool过滤
    names = np.array(['Ada', 'Bob', 'Jack', 'Joe', 'Bob', 'Will', 'Joe'])
    data = np.random.randn(7, 4)
    
    how_many_bob = names == 'Bob'
    # print(how_many_bob)     # 一个包含True or False的array,'Bob'所在的位置标为True,否则标为False。
    
    # 将'Bob'的数据过滤出来
    # bob_data = data[how_many_bob]
    # print(bob_data)
    
    # 如果我想拿到'Bob'的前3列数据呢?
    # bob_data_column3 = data[how_many_bob, :3]
    # print(bob_data_column3)
    
    # 如果我只想拿到'Bob'的第3列数据呢?
    # bob_data_column2 = data[how_many_bob, 2]
    # print(bob_data_column2)
    
    # 如果我想拿到除了'Bob'之外其他人的数据呢?需要用到 != 或者 ~
    # ~ 符号,在对通用条件进行取反时比较常用。
    # except_bob_data1 = data[names != 'Bob']
    # print(except_bob_data1)
    #
    # except_bob_data2 = data[~(names == 'Bob')]
    # print(except_bob_data2)
    
    # 如果我需要拿到'Bob'和'Joe'的数据呢?
    # 就需要让多个bool条件联合,需要用到数学操作符 &(and) 和 |(or)
    # Note: Python中的 and 和 or 在这里是没有作用的,只能用 & 和 | 操作符
    # mask = (names == 'Bob') | (names == 'Joe')
    # bob_joe_data = data[mask]
    # print(bob_joe_data)
    
    # 如果我想把data中所有的负数都设置为0呢?
    # data[data < 0] = 0
    # print(data)
    
    # 利用bool条件,还可以将筛选出的元素进行赋值
    # 比如我想把'Bob'的数据都改成250
    # data[names == 'Bob'] = 250
    # print(data)
    

    2. 神奇索引

    # 2. 神奇索引
    # '神奇索引'是Numpy中的术语,用于描述使用整数数组进行数据索引。
    # 假设我们有一个 8 * 4 的数组,让它的第一列都为1,第二列都为2,以此类推。
    arr = np.empty((8, 4))
    for i in range(8):
        arr[i] = i
    
    # 我们可以指定一个序列,序列中的值是我想获取的索引(第几行),可选值为0~7
    # index = [3, 2, 0, 7]
    # filtered_arr = arr[index]
    # print(filtered_arr)
    
    # 当然,在我们python中还可以进行反向索引
    # reverse_index = [-1, -3, -4]
    # filtered_arr2 = arr[reverse_index]
    # print(filtered_arr2)
    
    # 如果我想根据指定位置来筛选数据呢?
    # 当然可以,那么可以通过传递两个数组进行筛选。
    selected_element = arr[[1, 3, 5, 7], [0, 3, 2, 1]]
    
    # 第一个list的元素表示第几行,第二个list中的元素表示第几列
    # 那么上述表示的就是:(1,0), (3,3), (5,2), (7,1)
    print(selected_element)
    

    3. 转置矩阵

    # 3. 数组转置
    arr = np.arange(1, 16).reshape(3, 5)
    # print(arr)
    
    # 可以使用array的属性 T 获取转置矩阵
    # print(arr.T)
    
    arr2 = np.arange(1, 9).reshape(2, 4)
    # print(arr2)
    
    # 还可以用来求 矩阵和其转置矩阵的内积
    dot = np.dot(arr2, arr2.T)
    print(dot)
    

    4. 一元通用函数

    所谓一元通用函数,就是函数接受一个参数(只有一个变量)。
    PS: 有个别是二元通用函数,懒得摘出来了,自己挑吧...

    # 4. 快速的逐元素数组函数(一元通用函数)
    # 接下来看看numpy中常见的通用函数
    arr = np.arange(1, 10)
    
    # 4.1 np.sqrt() 开方
    # sqrt_arr = np.sqrt(arr)
    # print(sqrt_arr)
    
    # 4.2 np.exp() e的次方运算
    # exp_arr = np.exp(arr)
    # print(exp_arr)
    
    # 4.3 np.add() 加法运算,等同于 + 操作符
    # added_arr = np.add(arr, arr)
    # print(added_arr)
    
    # 4.4 np.maximum(arr1, arr2) 逐个比较两个arr,返回较大的值组成的array
    # arr2 = np.array([1, 5, 9])
    # arr3 = np.array([3, 4, 10])
    # arr4 = np.maximum(arr2, arr3)
    # print(arr4)
    
    # 4.5 np.minimum(arr1, arr2) 函数类似np.maximum,只不过取较小的值组成新的array
    
    # 4.6 np.modf(arr) 返回两个arr,一个arr中是整数部分,另一个arr是小数部分
    # Note:类似于python中math的modf()函数
    # arr5 = np.random.randn(7) * 10
    # integer_part, decimal_part = np.modf(arr5)
    # print(integer_part)
    # print(decimal_part)
    
    # math.modf() 返回小数部分和整数部分的元组, (decimal, integer)
    # import math
    #
    # integer_part1 = math.modf(12.34)
    # print(integer_part1)
    
    # 4.7 np.abs() np.fabs() 逐元素计算绝对值
    # 二者的区别在于,abs()返回的arr.dtype 是int64,fabs()返回的arr.dtype 是 float64
    # arr3 = np.array([-1, -3, 5, 7])
    # abs_arr = np.abs(arr3)
    # print(abs_arr, abs_arr.dtype)
    #
    # fabs_arr = np.fabs(arr3)
    # print(fabs_arr, fabs_arr.dtype)
    
    # 4.8 np.square(arr) 逐元素计算平方,等价于 arr ** 2
    # arr3 = np.arange(5)
    # square_arr = np.square(arr3)
    # print(square_arr)
    
    # 4.9 np.log() np.log10(), np.log2(), np.log1p()
    
    # 4.10 np.sign() 计算每个元素的符号值,1(正数), 0(0), -1(负数)
    # arr4 = np.array([-1, -5, 0, 2, 7])
    # sign_arr = np.sign(arr4)
    # print(sign_arr)
    
    # 4.11 np.ceil() 计算每个元素的向上取整
    # arr5 = np.array([-1.12, -3.78, 0, 1.56, 7.12])
    # ceil_arr = np.ceil(arr5)
    # print(ceil_arr)
    
    # 4.12 np.floor() 计算每个元素的向下取整
    
    # 4.13 np.rint() 将元素保留到整数位,并保持dtype不变
    # arr5 = np.array([-1.12, -3.78, 0, 1.56, 7.12])
    # rint_arr = np.rint(arr5)
    # print(rint_arr)
    
    # 4.14 np.isnan() 逐个元素判断是否是np.nan,返回一个bool类型的array
    # arr6 = np.array([1, 2, 3, np.nan, np.nan])
    # bool_arr = np.isnan(arr6)
    # print(bool_arr)
    
    # 怎么去掉array中的np.nan呢?可以利用之前学过的bool过滤
    # arr7 = arr6[~bool_arr]
    # print(arr7)
    
    # 4.15 np.isfinite() np.isinf()
    # isfinite() 逐个元素判断是否是有限(非inf, 非np.nan),返回bool array
    
    # 4.16 np.cos() np.cosh() np.sin() np.sinh() np.tan() np.tanh() 这6个都是三角函数
    
    # 4.17 np.arccos() np.arccosh() np.arcsin() np.arcsinh() np.arctan() np.arctanh() 反三角函数
    
    # 4.18 np.logical_not() 逐元素按位取反,与 ~arr 效果一致
    # arr8 = np.array([1,2,3,4])
    # logical_not_arr = np.logical_not(arr8)
    # print(arr8)
    

    5. 二元通用函数

    以此类推,这些函数需要接受两个参数呗。

    # 5. 二元通用函数
    # 5.1 np.add(arr1, arr2) 等效于 arr1 + arr2
    
    # 5.2 np.subtract(arr1, arr2) 等效于 arr1 - arr2
    # arr1 = np.array([1, 2, 3, 4])
    # arr2 = np.array([2, 3, 4, 6])
    # arr3 = np.subtract(arr1, arr2)
    # print(arr3)
    
    # 5.3 np.multiply(arr1, arr2) 等效于 arr1 * arr2
    
    # 5.4 np.divede() np.floor_divide()  除法 和 整除
    
    # 5.5 np.power(arr1, arr2) 将arr2中的元素作为arr1的幂次方
    # arr1 = np.array([1, 2, 3])
    # arr2 = np.array([2, 3, 4])
    # power_arr = np.power(arr1, arr2)
    # print(power_arr)
    
    # 5.6 np.maximum(arr1, arr2) np.fmax(arr1, arr2)
    # 逐个计算arr1和arr2对应位置的最大值,但是fmax()函数会忽略np.nan
    
    # 5.7 np.minimum(arr1, arr2) np.fmin()  同上
    
    # 5.8 np.mod()求模运算(除法求余数)
    # arr4 = np.array([1, 3, 5, 7])
    # mod_arr = np.mod(arr4, np.array([2, 2, 2, 2]))
    # print(mod_arr)
    
    # 5.9 np.copysign(arr1, arr2) 将arr1的符号改为arr2的
    # arr5 = np.array([-1, 2, -3])
    # arr6 = np.array([-1, -2, 3])
    # copysign_arr = np.copysign(arr5, arr6)
    # print(copysign_arr)
    
    # 5.10 还有数学操作符
    # 5.10.1 greater >
    # 5.10.2 greater_equal >=
    # 5.10.3 less <
    # 5.10.4 less_equal <=
    # 5.10.5 equal =
    # 5.10.6 not_equal !=
    
    # 5.11 还有逻辑操作符
    # 5.11.1 logical_and &
    # 5.11.1 logical_or |
    # 5.11.1 logical_xor ^
    

    相关文章

      网友评论

          本文标题:NumPy辟邪剑谱——进阶篇

          本文链接:https://www.haomeiwen.com/subject/lvgabctx.html