博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

二、Python开发---28、numpy(3)

Posted on 2020-02-24 12:50  兰智杰  阅读(214)  评论(0编辑  收藏  举报

ndarray访问、修改

  ndarray对象的内容可以通过索引或者切片来访问和修改,就像python的内置容器对象一样, ndarray对象中的元素遵循基于零的索引,有三种行可用的索引方法类型:字段访问、基本切片、高级索引

  1、字段访问、基本切片

  在各维度上单独切片,如果某维度都要保留,则直接使用冒号,不指定起始值和终止值,注意numpy中通过切片得到的新数组,只是原来数组的一个视图,因此对新数组进行操作也会影响原数组

import numpy as np
arr = np.arange(10)
arr2 = arr[2:7:2]
print(arr2)             #输出为 [2 4 6]
arr=np.array([[[1,2,3,4],
               [2,3,4,5],
               [3,4,5,6]],
              [[10,20,30,40],
               [20,30,40,50],
               [30,40,50,60]]])
print(arr[1])           #输出为 [[10 20 30 40]
                        #        [20 30 40 50]
                        #        [30 40 50 60]]
print(arr[1][1])        #输出为 [20 30 40 50]
print(arr[1][1][2])     #输出为 40
#取40 50
print(arr[1][1][2:])    #输出为 [40 50]
print(arr[1,1,2:])      #输出为 [40 50]
#获取第二维所有的数据加第三维的第一第二个数据
print(arr[1][:][0:1])  #获取失败  输出为 [[10 20 30 40]]
print(arr[1,:,0:2])    #获取成功 输出为[[10 20]
                       #                [20 30]
                       #                [30 40]]

   2、高级索引

  如果一个ndarray是非元组序列,数据类型为整数或布尔值的ndarray,或者至少一个元素为序列对象的元组,就能够用它来索引ndarray,高级索引始终返回数据的副本,与此相反,切片只提供了一个视图

  花式索引、 整数索引——花式索引指的是利用整数数组进行索引的方式,这种机制有助于基于 N 维索引来获取数组中任意元素,每个整数数组表示该维度的下标值,当索引的元素个数就是目标ndarray的维度时,会变得相当直接

import numpy as np
a = np.arange(9).reshape(3,3)
print(a)                            #输出为 [[0 1 2]
                                    #       [3 4 5]
                                    #       [6 7 8]]
a[[0,1,2],[0,1,2]] = 9
print(a)                            #输出为 [[9 1 2]
                                    #       [3 9 5]
                                    #       [6 7 9]]
num = a[[0,1,2],[0,1,2]]            #对应于(0,0),(1,1),(2,2)三个数
print(num)                          #输出为 [9 9 9]#使用索引器 np.ix_()
num1 = a[np.ix_([0,1,2],[0,1])]
print(num1)                         #输出为 [[9 1]
                                    #       [3 9]
                                    #       [6 7]]
num2 = a[[[0,0],[2,0]],[[0,1],[1,2]]]
print(num2)                         #输出为 [[9 1]
                                    #       [7 2]]

 

import numpy as np
arr = np.arange(18).reshape(2,3,3)
print(arr)                            #输出为[[[ 0  1  2]
                                      #        [ 3  4  5]
                                      #        [ 6  7  8]]
                                      #       [[ 9 10 11]
                                      #        [12 13 14]
                                      #        [15 16 17]]]
arr[...,[0,1,2],[0,1,2]] = 9
print(arr)                            #输出为 [[[ 9  1  2]
                                      #         [ 3  9  5]
                                      #         [ 6  7  9]]
                                      #        [[ 9 10 11]
                                      #         [12  9 14]
                                      #         [15 16  9]]]
#使用索引器
#num = arr[[0,1],[0,1,2],[0,1]]             #运行出错,不能这样索引
num = arr[np.ix_([0,1],[0,1,2],[0,1])]
num[:,0] = 99
print(num)                                  #输出为 [[[99 99]
                                            #         [ 3  9]
                                            #         [ 6  7]]
                                            #       [[99 99]
                                            #        [12  9]
                                            #        [15 16]]]
num[:,:,0] = 0
print(num)                                  #输出为 [[[ 0 99]
                                            #         [ 0  9]
                                            #         [ 0  7]]
                                            #       [[ 0 99]
                                            #        [ 0  9]
                                            #        [ 0 16]]]
print(arr)                                  #输出为 [[[ 9  1  2]
                                            #         [ 3  9  5]
                                            #         [ 6  7  9]]
                                            #        [[ 9 10 11]
                                            #         [12  9 14]
                                            #         [15 16  9]]]

  布尔索引——当结果对象是布尔运算的结果时,将使用此类型的高级索引

import numpy as np
arr = np.arange(12).reshape(2,6)
print(arr)                          #输出为 [[ 0  1  2  3  4  5]
                                    #       [ 6  7  8  9 10 11]]
print('大于五的元素是:')            #输出为 大于五的元素是:
print(arr[arr>5])                   #输出为 [ 6  7  8  9 10 11]
names = np.array(['joe','susan','tom'])
scores = np.array([[98,86,88,90],
                   [70,86,90,99],
                   [82,88,89,86]])
classic = np.array(['语文','数学','英语','科学'])
print('susan的成绩是:')            #输出为 susan的成绩是:
print(names=='susan')             #输出为 [False True False]
print(scores[names=='susan'])     #输出为 [[70 86 90 99]]

print('susan的数学成绩:')           #输出为 susan的数学成绩:
print(scores[names=='susan',classic=='数学'])                 #输出为 [86]
print(scores[names=='susan'].reshape(-1,)[classic=='数学'])   #输出为 [86]

print('joe和susan的成绩是:')                       #输出为 joe和susan的成绩是:
print(scores[(names=='joe')|(names=='susan')])    #输出为 [[98 86 88 90]
                                                  #       [70 86 90 99]]
print('非joe和susan的成绩')                         #输出为 非joe和susan的成绩
print(scores[(names!='joe')&(names!='susan')])    #输出为 [[82 88 89 86]]

数组转置与轴对换

  数组转置是指将shape进行重置操作,并将其值重置为原始shape元组的倒置,比如原始的shape值为:(2,3,4),那么转置后的新元组的shape的值为:(4,3,2),对于二维数组而言(矩阵)数组的转置其实就是矩阵的转置,可以通过调用数组的transpose函数或者T属性进行数组转置操作

import numpy as np
arr = np.arange(24).reshape(6,2,2)
print(arr.shape)                    #输出为 (6, 2, 2)
#以下三句话输出结果一致
print(np.transpose(arr))            #输出为 [[[ 0  4  8 12 16 20]
                                    #         [ 2  6 10 14 18 22]]
                                    #        [[ 1  5  9 13 17 21]
                                    #         [ 3  7 11 15 19 23]]]
print(arr.transpose())
print(arr.T)