zoukankan      html  css  js  c++  java
  • 神奇索引

    神奇索引

    为了选出一个符合特定顺序的子集,可以简单的通过传递一个包含指明所需顺序的列表或数组来完成:

    import numpy as np
    arr = np.empty((8,4))
    
    for i in range(8):
        arr[i] = i
    print(arr)
    print(arr[[4,3,0,6]])
    

    打印结果:

    [[0. 0. 0. 0.]
     [1. 1. 1. 1.]
     [2. 2. 2. 2.]
     [3. 3. 3. 3.]
     [4. 4. 4. 4.]
     [5. 5. 5. 5.]
     [6. 6. 6. 6.]
     [7. 7. 7. 7.]]
    
    [[4. 4. 4. 4.]
     [3. 3. 3. 3.]
     [0. 0. 0. 0.]
     [6. 6. 6. 6.]]
    
    

    也可以通过负的索引来。就不写上栗子了。

    传递多个索引数组时,情况有些不同,这样会根据每个索引元组对应的元素选出一个一维数组

    arr1 = np.arange(32).reshape((8,4))#重塑数组
    print(arr1)
    print('---------------|')
    arr2 = arr1[[1,5,7,2], [0,3,1,2]]
    print(arr2)
    

    打印结果:

    [[ 0  1  2  3]
     [ 4  5  6  7]
     [ 8  9 10 11]
     [12 13 14 15]
     [16 17 18 19]
     [20 21 22 23]
     [24 25 26 27]
     [28 29 30 31]]
    ---------------|
    [ 4 23 29 10]
    

    在上面的栗子中,元素(1,0)、(5,3)、(7,1)、(2,2)被选中,如果不考虑数组的维数,神奇索引的结果总是一维的。

    想象之中他的结果不应该是这样,而是通过矩阵中行列的子集形成的矩形区域,但是也可以通过下面的方式实现:

    print(arr1[[1,5,7,2]])
    print('---------------|')
    print(arr1[[1,5,7,2]][:,[0,3,1,2]])
    

    打印结果:

    [[ 4  5  6  7]
     [20 21 22 23]
     [28 29 30 31]
     [ 8  9 10 11]]
    ---------------|
    [[ 4  7  5  6]
     [20 23 21 22]
     [28 31 29 30]
     [ 8 11  9 10]]
    

    这就是想象中的样子。

    请牢记神奇索引与切片的不同,神奇索引总是将数据赋值到一个新的数组中,这就意味着你改变生成的新数组不会对原来的数组产生影响,而切片会,他的视图都是原来的数组

  • 相关阅读:
    css--兼容写法整理
    vuerouter-7._路由高亮
    vuerouter-6_路由杂项
    vuerouter-5.参数传递
    vuerouter-4.编程式导航
    vuerouter-3.路由嵌套
    正则表达式
    STL容器迭代器失效分析
    coredump
    获取结构体成员偏移量
  • 原文地址:https://www.cnblogs.com/chanyuli/p/11762410.html
Copyright © 2011-2022 走看看