有的是看别人的视频和文档,有的是自己悟的,如有错误,请指正。
切片索引是利用切片进行索引。(与列表中的切片基本一样)
花式索引是利用整数数组进行的索引。
布尔索引是利用与原数组相同维度的 只包含True、False值的数组索引,并只返回True的值。
import numpy as np
import numpy as np
In [110]:
a= np.random.randn(4,3)
a
a= np.random.randn(4,3)
a
Out[110]:
array([[-0.71696528, 0.76921297, -1.73852093],
[-1.37913036, -0.97313174, 0.06219392],
[-0.23892102, -0.00560969, 0.61863407],
[-0.84243978, -0.60846437, 1.05872804]])
花式索引
#花式索引,其中必须两个位置参数中,是整数,可以分别是列表或者元组形式,代表的是下标
In [112]:
#花式索引可以理解为,深拷贝,对新数组的操作不影响原数组
In [113]:
b0 = a[1,2]
b0
Out[113]:
0.0621939230687335
In [114]:
#可以看到,下面a 数组并没有因为b0变化而变化
In [115]:
b0 = 0
print(a)
[[-0.71696528 0.76921297 -1.73852093]
[-1.37913036 -0.97313174 0.06219392]
[-0.23892102 -0.00560969 0.61863407]
[-0.84243978 -0.60846437 1.05872804]]
In [116]:
b1 = a[(1,3),2]
b1
Out[116]:
array([0.06219392, 1.05872804])
In [117]:
#情况一样,多元素的花式索引,原数组a没变
In [118]:
b1 = 0
print(a)
[[-0.71696528 0.76921297 -1.73852093]
[-1.37913036 -0.97313174 0.06219392]
[-0.23892102 -0.00560969 0.61863407]
[-0.84243978 -0.60846437 1.05872804]]
切片索引
#从原数组中,切片得来的新数组:
In [120]:
c = a[0:3,:]
c
Out[120]:
array([[-0.71696528, 0.76921297, -1.73852093],
[-1.37913036, -0.97313174, 0.06219392],
[-0.23892102, -0.00560969, 0.61863407]])
In [121]:
#对切片得来的数组 -赋值操作
In [122]:
c[:,:] = 0.5
c
Out[122]:
array([[0.5, 0.5, 0.5],
[0.5, 0.5, 0.5],
[0.5, 0.5, 0.5]])
In [123]:
#请看大屏幕,此时的,影响到了原数组a,可以理解为数组的切片操作-浅拷贝
In [124]:
print(a)
[[ 0.5 0.5 0.5 ]
[ 0.5 0.5 0.5 ]
[ 0.5 0.5 0.5 ]
[-0.84243978 -0.60846437 1.05872804]]
布尔索引
#下面实验 布尔实验
In [126]:
scores = a
In [127]:
#假设 上面的数组a的每一行,是每个人的成绩,每一列,代表语数外的成绩
In [128]:
names = np.array(['zhangsan','lisi', 'wangwu','xionger'])
In [129]:
#看,对数组的 == ,意味着对每一个 元素的 ==,最后得到与 原数组相同维度的、只包含
#True和False的数组
In [130]:
names=='zhangsan'
Out[130]:
array([ True, False, False, False])
In [132]:
(names =='zhangsan')& (names == 'xionger')
Out[132]:
array([False, False, False, False])
In [133]:
#注意 下面的这个,相当于花式索引,方括号代表索引,然后里面的这个是 一个与scores 第一维度
#相同的shape的数组,(4,),然后因为第一个是True,因此相当于 索引scores【0,:】
In [134]:
scores[names=='zhangsan']
Out[134]:
array([[0.5, 0.5, 0.5]])
In [141]:
d = scores[names=='zhangsan']
print(d)
print(scores[0,:])
[[0.5 0.5 0.5]]
[0.5 0.5 0.5]
In [142]:
e = scores[names=='zhangsan',1:3]
e
Out[142]:
array([[0.5, 0.5]])
In [ ]:
#证明,只要有布尔索引,那么还是花式索引,还是深拷贝,即新数组操作,不影响原数组
In [143]:
e = 0
print(scores)
[[ 0.5 0.5 0.5 ]
[ 0.5 0.5 0.5 ]
[ 0.5 0.5 0.5 ]
[-0.84243978 -0.60846437 1.05872804]]
#每个维度的索引,只能有一个布尔索引,剩下维度可以布尔、切片和花式索引的