zoukankan      html  css  js  c++  java
  • Numpy_02 索引和切片

    github博客传送门
    csdn博客传送门

    Numpy系列

    Numpy_01 创建 指定数据类型 查看维度和数据类型 简单的数学运算
    Numpy_02 索引和切片
    Numpy_03 转置和轴对换
    Numpy_04 通用函数
    Numpy_05 数据处理
    Numpy_06 数组的文件输入输出 线性代数

    一维数组

    arr = np.arange(10)  # 创建一个 0-9的数组
    print (arr)
    print (arr[5])  #arr的第6个元素
    print (arr[5:8])  # arr的第6-8个元素,[5:8]左闭右开
    arr[5:8] = 12  # 对数组的切片的改变 会直接使原数组的值进行改变
    print (arr)
    arr_slice = arr[5:8]  # 我们将这个修改后的数组切片出来看看是被修改过
    print (arr_slice)
    arr_slice[1] = 12345  # 接着我们对  arr_slice中的值进行修改 变动也会体现在原始数组arr中
    print (arr)
    arr_slice[:] = 64  # 接着尝试修改 arr_slice里的所有值
    print (arr)  # arr数组里的值也会被改变
    # 如果你想得到的是一分副本而非视图,就需要进行明确的复制操作,例如 arr[5:8].copy()。
    

    多维数组

    多维数组

    arr2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
    print(arr2d[2])      # 输出:[7 8 9]
    print (arr2d[0][2])  # 等价于下面这个 输出:第一行第三列的数据 3
    print (arr2d[0, 2])  # 等价于上面这个 输出:第一行第三列的数据 3
    

    在多维数组中,如果省略了后面的索引,则返回对象会是一个维度低一点的ndarray(它含有高一级维度上的所有数据)。

    arr3d = np.array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]])
    print(arr3d)
    输出:
    
    [[[ 1 2 3]
    [ 4 5 6]]
    
    [[ 7 8 9]
    [10 11 12]]]
    # arr3d[0]是一个2×3数组
    print(arr3d[0])
    
    [[1 2 3]
    [4 5 6]]
    
    
    标量值和数组都可以被赋值给arr3d[0]
    #将arr3d[0]的数据进行备份
    old_values = arr3d[0].copy()  # 复制了一份副本
    #修改arr3d[0]的值为42
    arr3d[0] = 42  # 赋值了一个标量
    print(arr3d)
    print('===========分割线============')
    arr3d[0] = old_values  # 赋值了一个数组
    print(arr3d)
    输出:
    [[[42 42 42]
    [42 42 42]]
    
    [[ 7 8 9]
    [10 11 12]]]
    ===========分割线============
    [[[ 1 2 3]
    [ 4 5 6]]
    
    [[ 7 8 9]
    [10 11 12]]]
    
    # 返回的数组视图
    print (arr3d[1, 0])
    print('===========分割线============')
    x = arr3d[1]
    print (x)
    print (x[0])
    

    切片索引

    下图对此进行了说明。注意,“只有冒号”表示选取整个轴,因此你可以像下面这样只对高维轴进行切片。
    高维切片

    arr = np.array([0, 1, 2, 3, 4, 12, 12, 12, 8, 9])  # 创建一个数组
    print(arr)       # 打印这个数组
    print(arr[1:6])  # 切片这个数组 显示这个数组的部分值 输出:[ 1 2 3 4 12 ]
    

    我们继续看个例子:

    arr2 = np.arange(1, 10).reshape(3,3)  # 创建了一个数组 内容是 1-9 再 reshape成 3 * 3 的矩阵
    
    print(arr2)  # 打印 创建好的矩阵 arr2
    输出:
    [[1 2 3]
    [4 5 6]
    [7 8 9]]
    print('以下是切片后的效果')  # 分隔一下
    
    print(arr2[:2])  # 切片从头到 第二个元素的值 
    # 输出 
    [[1 2 3]
    [4 5 6]]
    
    print(arr2d[:2, 1:]) # 切片操作 选择前两行 再选择后两列
    # 输出
    [[2 3]
    [5 6]]
    
    print(arr2d[1, :2]) # 选取 第二行 再选择前两列
    # 输出
    [4 5]
    
    print(arr2d[:2, 2]) # 选取 前两行 再选择第三列
    # 输出
    [3 6]
    
    print(arr2d[:, :1]) # 选择所有的行 再选择第一列 就可以单独输出所有第一列的数据了
    # 输出
    [[1]
    [4]
    [7]]
    

    布尔型索引

    names = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'])  # 创建了一个 字符串数组
    data = np.random.randn(7,4)  # 创建了一个 随机的  七行四列的 数组
    print(names)                 # 打印出这个字符串数组
    print(data)                  # 打印出这个 随机的数组
    print(names == 'Bob')        # 如果 names 的值 等于 'Bob' 返回一个 布尔类型的矩阵
    print(data[names == 'Bob'])  # 上面这个布尔类型的数组可用于数组索引 索引出 data 数组中的 第一行 和第四行
    

    布尔型数组的长度必须跟被索引的轴长度一致。此外,还可以将布尔型数组跟切片、整数(或整数序列,稍后将对此进行详细讲解)混合使用:

    print(data[names == 'Bob', 2:])  # 对上述索引之后的值 进行 切片索引
    print('===========分割线============')
    print(data[names == 'Bob', 3])  # 对上述索引之后的值 进行 切片索引
    

    取反

    print(names != 'Bob')           # 返回一个 names 不等于 'Bob' 值的 布尔类型数组
    print(data[~(names == 'Bob')])  # 索引出 data里面 names里不等于 'Bob' 的数列的数据行
    

    操作符~

    cond = names == 'Bob'  # 赋值cond
    print(data[~cond])          # 打印出 data的索引 ~ names == 'Bob'的值
    

    通过布尔型索引选取数组中的数据,将总是创建数据的副本,即使返回一模一样的数组也是如此。
    选取这三个名字中的两个需要组合应用多个布尔条件,使用&(和)、|(或)之类的布尔算术运算符即可:

    mask = (names == 'Bob') | (names == 'Will')  # 选取 names值为'Bob' 或者 names值为'Will' 返回一个布尔类型的数组
    print(mask)        # 将这个布尔类型的数组 赋给mask
    print(data[mask])  # 将上面的布尔类型的数组 当作索引 来 索引出 data数组里的 数据
    

    通过布尔型数组设置值是一种经常用到的手段。为了将data中的所有负值都设置为0,我们只需:

    data[data < 0] = 0  # 将数组中所有值小于0 的都设置为 0
    print (data)
    

    通过一维布尔数组设置整行或列的值也很简单:

    data[names != 'Joe'] = 7
    print(data)
    

    花式索引

    arr = np.empty((8,4))   # 创建一个 8行4列的数组
    for i in range(8):      # 遍历8次
    arr[i] = i              # 将这个数组的前八行 赋值为 行号的值
    print(arr)
    

    为了以特定顺序选取行子集,只需传入一个用于指定顺序的整数列表或ndarray即可:

    print (arr[[4, 3, 0, 6]]) # 选取 第5行 4行 1行 7行输出
    print(arr[[-3, -5, -7]])  # 选取倒数 第3行 第5行 第7行 输出
    

    一次传入多个索引数组会有一点特别。它返回的是一个一维数组,其中的元素对应各个索引元组:

    arr = np.arange(32).reshape((8, 4))  # 创建一个 0-31 的一维数组 再reshape为一个8行4列的数组
    print(arr)
    print(arr[[1, 5, 7, 2], [0, 3, 1, 2]])  # 索引 第一个列表行号 第二个列表列号 对应的值 x y轴定位
    
  • 相关阅读:
    Golang1.14.2 环境的安装
    Golang Module快速入门
    VS Code配置Go语言开发环境
    Go语言Mac、Linux、Windows 下交叉编译
    centerOS7 Yum 安装lnmp环境
    初步了解Fork/Join框架
    聊聊并发(七)——Java中的阻塞队列
    如何快速成长为技术大牛
    多线程-interrupt(),isInterrupted(),interrupted()(转)
    Rabbit MQ
  • 原文地址:https://www.cnblogs.com/Mrzhang3389/p/9684745.html
Copyright © 2011-2022 走看看