Numpy的切片与索引
ndarray对象内容可以通过索引或切片来访问和修改。
索引方法类型:字段访问;基本切片;高级索引。
存取元素
- Numpy数组元素的存取方法和Python序列型数据的索引切片方法相同。
>>>import numpy as np
>>>a=np.arange(10)
>>>a
a[5] #用整数作为下标可以获取数组中的某个元素
a[3:5] #用范围作为下标可以获取数组的一个切片,包括a[3]不包括a[5]
a[:-1]
a[2:4]=100,101 #下标可用于修改元素的值
a
print(a[1:-1:2])
- 和python的列表序列不同,通过下标范围获取的新的数组是原始数组的一个视图,它与原始数组共享一块数据空间。
print(a)
b=a[3:7]
print(b)
b[2]=-10 #将b的第二个元素修改为-10
print(b)
print(a)
s=[3,2,1,5,6,7,8,9]
t=s[1:5]
t[0]=999
print(t)
print(s)
数据的“深浅拷贝”
存取元素中的“浅拷贝”与“深拷贝”
- 整数序列
当使用整数序列对数组元素进行存取时,将整数序列中的每个元素作为下标,整数序列可以是列表或者数组。使用整数序列作为下标获得的数组不和原始数组共享数据空间。
>>>x=np.arange(10,1,-1)
>>>x
array([10, 9, 8, 7, 6, 5, 4, 3, 2])
>>>x[[3,3,1,8]] #获取x中下标为3,3,1,8的四个元素,组成一个新的数组
array([7, 7, 9, 2])
>>>b=x[np.array([3,3,-3,8])]
>>>b
array([7, 7, 4, 2])
>>>b[2]=100
>>>b
array([ 7, 7, 100, 2])
>>>x #x和b不共享数据空间,所以x值不变
array([10, 9, 8, 7, 6, 5, 4, 3, 2])
>>>x[[3,5,1]]=-1,-2,-3 #修改下标为3,5,1的数据为-1,-2,-3
>>>x
array([10, -3, 8, -1, 6, -2, 4, 3, 2])
- 布尔数组
当时用布尔数组b作为下表存取数组x中的元素时,将收集数组x中所有在数组b中对应为True的元素。使用布尔数组作为下标获得的数组不和原始数组共享数据空间。这种方式只对应于布尔数组,不能使用布尔列表。
>>>x=np.arange(5,0,-1)
>>>x
array([5, 4, 3, 2, 1])
>>>x=[np.array([True,False,True,False,False])]
array([5, 3]) #布尔数组中下标为0,2的元素为True,所以取下标为0,2的元素
>>>x[np.array([True,False,True,True,False])]=-1,-2,-3
>>>x #用布尔数组下标修改元素
array([-1, 4, -2, -3, 1])
>>>x=np.random.rand(10) #产生一个长度为10,元素值为0-1的随机数组
>>>x
array([0.37364332, 0.22582681, 0.23391187, 0.39004449, 0.67905988,
0.34130333, 0.5224068 , 0.54500064, 0.23887468, 0.80456742])
>>>x[x>0.5]
array([0.67905988, 0.5224068 , 0.54500064, 0.80456742])
多维数组
多维数组下标由多个值来表示,Numpy采用元组作为数组下标。
多维数组同样可以使用整数序列和布尔数组进行存取。