• numpy的切片和索引


    ndarray 对象的内容可以通过索引或切片来访问和修改,与 Python 中 list 的切片操作 一样。ndarray 数组可以基于 0 - n 的下标进行索引,并设置 start, stop 及 step 参数进行,从 原数组中切割出一个新数组。

    一维数组切片和索引的使用

    import numpy as np
    x = np.arange(10)
    y = x[2:7:2]
    z = x[2:]
    print(y)
    print(z)

    运行结果如下:

    [2 4 6]
    [2 3 4 5 6 7 8 9]

    根据索引直接获取

    import numpy as np
    x = np.arange(1,13)
    a = x.reshape(4,3)
    print("数组元素")
    print(a)
    print("获取第二行")
    print(a[1])
    print("获取第三行第二列")
    print(a[2][1])

    运行结果如下:

    数组元素
    [[ 1  2  3]
     [ 4  5  6]
     [ 7  8  9]
     [10 11 12]]
    获取第二行
    [4 5 6]
    获取第三行第二列
    8

    二维数组切片的使用

    import numpy as np
    x = np.arange(1,13)
    a = x.reshape(4,3)
    print("数组元素")
    print(a)
    # 使用索引获取
    print("所有行的第二列")
    print(a[:,1])
    print("奇数行的第一列")
    print(a[::2,0])

    运行结果如下:

    数组元素
    [[ 1  2  3]
     [ 4  5  6]
     [ 7  8  9]
     [10 11 12]]
    所有行的第二列
    [ 2  5  8 11]
    奇数行的第一列
    [1 7]

    使用坐标获取数组[x,y]

    import numpy as np
    x = np.arange(1,13)
    a = x.reshape(4,3)
    print("数组元素")
    print(a)
    # 使用索引获取
    print('获取第三行第二列')
    print(a[2,1])
    print('同时获取第三行第二列,第四行第一列')
    print(np.array((a[2,1],a[3,0])))
    print(a[(2,3),(1,0)]) #2,1 3,0

    运行结果如下:

    数组元素
    [[ 1  2  3]
     [ 4  5  6]
     [ 7  8  9]
     [10 11 12]]
    获取第三行第二列
    8
    同时获取第三行第二列,第四行第一列
    [ 8 10]
    [ 8 10]

    索引为负数来获取

    import numpy as np
    x = np.arange(1,13)
    a = x.reshape(4,3)
    print("数组元素")
    print(a)
    print("获取最后一行")
    print(a[-1])
    print("行进行倒序")
    print(a[::-1])
    print("行列都倒序")
    print(a[::-1,::-1])

    运行结果如下:

    数组元素
    [[ 1  2  3]
     [ 4  5  6]
     [ 7  8  9]
     [10 11 12]]
    获取最后一行
    [10 11 12]
    行进行倒序
    [[10 11 12]
     [ 7  8  9]
     [ 4  5  6]
     [ 1  2  3]]
    行列都倒序
    [[12 11 10]
     [ 9  8  7]
     [ 6  5  4]
     [ 3  2  1]]

    切片还可以包括省略号 …,来使选择元组的长度与数组的维度相同。 如果在行位置使用省略号,它将返回包含行中元素的 ndarray。

    import numpy as np
    a = np.array([[1,2,3],[3,4,5],[4,5,6]])
    print(a[...,1]) # 第2列元素
    print(a[1,...]) # 第2行元素
    print(a[...,1:]) # 第2列及剩下的所有元素

    运行结果如下:

    [2 4 5]
    [3 4 5]
    [[2 3]
     [4 5]
     [5 6]]

    ndarray对象的内容可以通过索引或切片来访问和修改,与 Python 中 list 的切片操作一样。
    ndarray 数组可以基于 0 - n 的下标进行索引,切片对象可以通过内置的 slice 函数,并设置 start, stop 及 step 参数进行,从原数组中切割出一个新数组。

    import numpy as np
     
    a = np.arange(10)
    s = slice(2,7,2)   # 从索引 2 开始到索引 7 停止,间隔为2
    print (a[s])

    运行结果为:

    [2  4  6]

    实例获取了 4X3 数组中的四个角的元素

    import numpy as np
    x = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11]])
    print('我们的数组是:')
    print(x)
    print('
    ')
    rows = np.array([[0,0],[3,3]])
    cols = np.array([[0,2],[0,2]])
    y = x[rows,cols]
    print  ('这个数组的四个角元素是:')
    print (y)

    运行结果如下:

    我们的数组是:
    [[ 0  1  2]
     [ 3  4  5]
     [ 6  7  8]
     [ 9 10 11]]
    
    这个数组的四个角元素是:
    [[ 0  2]
     [ 9 11]]

    布尔索引
    布尔索引通过布尔运算(如:比较运算符)来获取符合指定条件的元素的数组。

    import numpy as np  
    x = np.array([[  0,  1,  2],[  3,  4,  5],[  6,  7,  8],[  9,  10,  11]])  
    print ('我们的数组是:')
    print (x)
    print ('
    ')
    # 现在我们会打印出大于 5 的元素  
    print  ('大于 5 的元素是:')
    print (x[x >  5])

    输出结果为:

    我们的数组是:
    [[ 0  1  2]
     [ 3  4  5]
     [ 6  7  8]
     [ 9 10 11]]
    
    大于 5 的元素是:
    [ 6  7  8  9 10 11]

    下面再举个例子

    import numpy as np
    # 布尔型索引及切片
    
    ar = np.arange(12).reshape(3,4)
    i = np.array([True,False,True])
    j = np.array([True,True,False,False])
    print(ar)
    print(i)
    print(j)
    print(ar[i,:])  # 在第一维度做判断,只保留True,这里第一维度就是行,ar[i,:] = ar[i](简单书写格式)
    print(ar[:,j])  # 在第二维度做判断,这里如果ar[:,i]会有警告,因为i是3个元素,而ar在列上有4个
    # 布尔型索引:以布尔型的矩阵去做筛选
    
    m = ar > 5
    print(m)  # 这里m是一个判断矩阵
    print(ar[m])  # 用m判断矩阵去筛选ar数组中>5的元素 → 重点

    运行结果如下:

    [[ 0  1  2  3]
     [ 4  5  6  7]
     [ 8  9 10 11]]
    [ True False  True]
    [ True  True False False]
    [[ 0  1  2  3]
     [ 8  9 10 11]]
    [[0 1]
     [4 5]
     [8 9]]
    [[False False False False]
     [False False  True  True]
     [ True  True  True  True]]
    [ 6  7  8  9 10 11]

    ~(取补运算符)来过滤 NaN。

    import numpy as np 
     
    a = np.array([np.nan,  1,2,np.nan,3,4,5])  
    print (a[~np.isnan(a)])

    输出结果为:

    [ 1.   2.   3.   4.   5.]

    改变数组的维度
    处理数组的一项重要工作就是改变数组的维度,包含提高数组的维度和降低数组的维 度,还包括数组的转置。Numpy 提供的大量 API 可以很轻松地完成这些数组的操作。例如, 通过 reshape 方法可以将一维数组变成二维、三维或者多维数组。通过 ravel 方法或 flatten 方法可以将多维数组变成一维数组。改变数组的维度还可以直接设置 Numpy 数组的 shape 属性(元组类型),通过 resize 方法也可以改变数组的维度。

    import numpy as np
    # 创建一维数组
    a = np.arange(24)
    print(a)
    print("数组a的维度: ",a.shape)
    print('-'*30)
    # 使用reshape将一维数组变成三维数组
    b = a.reshape(2,3,4)
    print(b)
    print("数组b的维度:",b.shape)
    print("-"*30)
    # 将a变成二维数组
    c = a.reshape(3,8)
    print(c)
    print("数组c的维度:",c.shape)
    print("-"*30)
    #将 a 变成二维数组
    c=a.reshape(3,8)
    print(c)
    print('数组 c 的维度:',c.shape)
    print('-'*30)
    # 使用reval函数将三维的b变成一维数组
    a1=b.ravel()
    print(a1)
    print('-'*30)
    #使用 flatten 函数将二维的 c 变成一维的数组
    a2=c.flatten()
    print(a2)
    print('-'*30)
    别废话,拿你代码给我看。
  • 相关阅读:
    IOS回调机制总结
    2.25~当svn服务器ip地址变了怎么办?
    ubuntu硬件信息,内存DDR详细信息
    关于JS相等比较算法(==)的原理
    ubuntu更改鼠标滚轮方向为自然方向(运动方向和滚轮滚动方向一致)
    C#模拟js的Json对象创建,操作
    关于json返回日期格式化的解决方案
    js定时器 timer
    ubuntu GUI界面复制文件没权限的解决方案
    CodeSmith 模板
  • 原文地址:https://www.cnblogs.com/lvxueyang/p/13707512.html
Copyright © 2020-2023  润新知