numpy运算与Pandas

这篇博客介绍了numpy的矩阵操作,包括基本运算、广播机制和排序,然后详细探讨了Pandas的Series和DataFrame,包括创建、索引、切片和运算,展示了它们与numpy的异同。
摘要由CSDN通过智能技术生成

numpy中运算

import numpy as np
nd = np.arange(1,5).reshape((2, 2))
nd
  • 输出

    array([[1, 2],
    [3, 4]])

# tile循环, 依赖是行, 把每行中的数据循环N次
np.tile(nd, 3)
  • 输出

    array([[1, 2, 1, 2, 1, 2],
    [3, 4, 3, 4, 3, 4]])

# repeat循环会先降维,再进行循环
np.repeat(nd, 3)
  • 输出

    array([1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4])

五、ndarray的矩阵操作

1. 基本矩阵操作

  1. 算术运算符:
  • 加减乘除
nd1 = np.random.randint(0, 10, size=(5, 4))
nd1
  • 输出

    array([[4, 3, 3, 1],
    [9, 3, 6, 4],
    [8, 3, 5, 6],
    [0, 6, 2, 2],
    [5, 9, 9, 7]])

# 矩阵加上单个数值=每个基本元素都加上该值
nd1 + 3
  • 输出

    array([[ 7, 6, 6, 4],
    [12, 6, 9, 7],
    [11, 6, 8, 9],
    [ 3, 9, 5, 5],
    [ 8, 12, 12, 10]])

np.add() 求和

不对原来的数组产生影响

# 在jupyter中,如果某个函数对原来数组产生影响的话,不会直接输出
np.add(nd1,10)
  • 输出

    array([[14, 13, 13, 11],
    [19, 13, 16, 14],
    [18, 13, 15, 16],
    [10, 16, 12, 12],
    [15, 19, 19, 17]])

    乘积 np.multiply() 乘积

    不对原来的结果产生影响

np.multiply(nd1, 10)
  • 输出

    array([[40, 30, 30, 10],
    [90, 30, 60, 40],
    [80, 30, 50, 60],
    [ 0, 60, 20, 20],
    [50, 90, 90, 70]])

    矩阵的乘积 np.dot()

nd2 = np.random.randint(0, 10, size=(4, 5))
nd2
  • 输出

    array([[6, 8, 2, 8, 3],
    [4, 2, 2, 0, 5],
    [6, 0, 0, 8, 9],
    [4, 3, 0, 0, 3]])

np.dot(nd1, 10)
  • 输出

    array([[40, 30, 30, 10],
    [90, 30, 60, 40],
    [80, 30, 50, 60],
    [ 0, 60, 20, 20],
    [50, 90, 90, 70]])

np.dot(nd1, nd2)
  • 输出

    array([[ 58, 41, 14, 56, 57],
    [118, 90, 24, 120, 108],
    [114, 88, 22, 104, 102],
    [ 44, 18, 12, 16, 54],
    [148, 79, 28, 112, 162]])

三维乘以一维

nd3 = np.random.randint(0, 10, size=(5, 4, 3))
nd4 = np.random.randint(0, 10, size=3)
nd3
  • 输出

    array([[[6, 2, 8],
    [3, 9, 7],
    [2, 8, 1],
    [2, 4, 9]],

         [[6, 7, 3],
          [2, 3, 6],
          [9, 7, 2],
          [2, 7, 7]],
    
         [[2, 7, 5],
          [0, 3, 6],
          [2, 5, 0],
          [1, 4, 7]],
    
         [[6, 3, 0],
          [9, 3, 8],
          [0, 9, 3],
          [4, 9, 6]],
    
         [[0, 0, 6],
          [5, 6, 6],
          [7, 9, 6],
          [5, 8, 6]]])
    
nd4
  • 输出

    array([8, 8, 8])

np.dot(nd3, nd4)
  • 输出

    array([[128, 152, 88, 120],
    [128, 88, 144, 128],
    [112, 72, 56, 96],
    [ 72, 160, 96, 152],
    [ 48, 136, 176, 152]])

三维乘以二维

nd3 = np.random.randint(0, 10, size=(5, 4, 3))
nd3
  • 输出

    array([[[6, 2, 0],
    [7, 0, 3],
    [1, 3, 2],
    [0, 5, 0]],

         [[5, 1, 8],
          [2, 2, 0],
          [4, 0, 4],
          [2, 4, 6]],
    
         [[3, 0, 5],
          [4, 4, 0],
          [6, 3, 0],
          [3, 3, 4]],
    
         [[5, 6, 3],
          [4, 5, 2],
          [8, 1, 5],
          [6, 4, 3]],
    
         [[4, 7, 9],
          [3, 6, 3],
          [5, 7, 6],
          [5, 3, 7]]])
    
nd4 = np.random.randint(0, 10, size=(3, 1))
nd4
  • 输出

    array([[0],
    [8],
    [7]])

np.dot(nd3, nd4)
  • 输出

    array([[[ 16],
    [ 21],
    [ 38],
    [ 40]],

         [[ 64],
          [ 16],
          [ 28],
          [ 74]],
    
         [[ 35],
          [ 32],
          [ 24],
          [ 52]],
    
         [[ 69],
          [ 54],
          [ 43],
          [ 53]],
    
         [[119],
          [ 69],
          [ 98],
          [ 73]]])
    

2. 广播机制

【重要】ndarray广播机制的两条规则

规则一:为缺失的维度补1
规则二:假定缺失元素用已有值填充
例1: m = np.ones((2, 3)) a = np.arange(3) 求M+a

nd1 = np.ones((2, 3))
nd1
  • 输出

    array([[1., 1., 1.],
    [1., 1., 1.]])

nd2 = np.arange(3)
nd2
  • 输出

    array([0, 1, 2])

nd1 + nd2
  • 输出

    array([[1., 2., 3.],
    [1., 2., 3.]])

np.add(nd1, nd2)
  • 输出

    array([[1., 2., 3.],
    [1., 2., 3.]])

六、ndarray的排序

小测验: 使用以上所学numpy的知识,对一个ndarray对象进行选择排序。

代码越短越好

nd = np.random.randint(0, 150, size=10)
nd
  • 输出

    array([16, 13, 64, 94, 11, 4, 8, 18, 53, 82])

for i in range(nd.size):
    for j in range(nd.size - 1):
        if nd[i]<nd[j]:
            nd[i], nd[j]= nd[j], nd[i]
nd1 = np.random.randint(0, 150, size=10)
# 用一层循环
# argmin, 封装成函数

def sort_nd(nd):
    for i in range(nd.size):
        min_index = nd[i:].argmin() + i
        nd[i], nd[min_index] = nd[min_index], nd[i]
            
sort_nd(nd1)
nd1
  • 输出

    array([ 3, 5, 15, 16, 20, 31, 97, 117, 121, 124])

1. '快速’排序

np.sort()与ndarray.sort()都可以,但有区别:

  • np.sort()不改变输入
  • ndarray.sort()本地处理,不占用空间,但改变输入
nd2 = np.random.randint(0, 10, size=10)
nd2
  • 输出

    array([0, 7, 6, 4, 3, 6, 5, 4, 8, 2])

np.sort(nd2)
  • 输出

    array([0, 2, 3, 4, 4, 5, 6, 6, 7, 8])

# 对原数组产生影响的
nd2.sort()

2. 部分排序

np.partition(a,k)

有的时候我们不是对全部数据感兴趣,我们可能只对最小或最大的一部分感兴趣。

- 当k为正时,我们想要得到最小的k个数
- 当k为负时,我们想要得到最大的k个数


```python
nd3 = np.random.randint(0, 10000, size=100)
nd3
  • 输出

    array([ 732, 4152, 6395, 2513, 8923, 2514, 5521, 2771, 6992, 4554, 3441,
    6460, 4370, 6993, 5186, 2202, 9520, 7577, 5361, 3052, 6414, 6556,
    4464, 8971, 9111, 3510, 6266, 9991, 5446, 1311, 4478, 3794, 6912,
    7155, 562, 1171, 6855, 4052, 7125, 1780, 2284, 94, 6662, 293,
    1919, 1984, 9865, 1762, 7369, 8426, 6908, 5491, 8393, 6186, 6700,
    2388, 5456, 8942, 5620, 3706, 5725, 2838, 3107, 6969, 3391, 7052,
    6796, 3079, 3619, 2407, 7528, 345, 3444, 5699, 9435, 6056, 9739,
    3832, 6933, 1365, 1004, 6159, 3489, 6884, 6192, 8333, 7274, 8907,
    8613, 5055, 3885, 6131, 2329, 2686, 7628, 6138, 3970, 2815, 8916,
    1910])

np.partition(nd3, -5)[-5<
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值