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)