1、索引和切片
- 需特别注意的是当你将一个标量赋值给一个数组的切片(可以是a[:])时,该标量值会自动传播到整个选区。相当于给数组整片区域进行赋值。
- 对数组切片进行赋值(可用标量,也可以用数组进行赋值)会直接改变原数组的值。如果不想改变,可以用c = a[1:3].copy()的方式
- 数组a = 数组b这样的语句其实并没有复制一个新的数组,a和b都是指的的同一个数组,因此数组不会通过赋值产生新的数组,也不会通过切片索引产生新的数组。但是通过布尔值索引和花式索引会产生新的数组。
- 对上面这句话做个总结:无论是切片索引、布尔值索引还是花式索引,如果直接对于索引出来的部分进行修改或赋值的话,都会对原始数组进行修改;如果将索引出来的部分再次赋值给一个新的数组(即a = 索引部分),并对新的数组a进行修改或赋值的话,只有切片索引会对原始数组进行修改,后两者都不会。
>>> b
array([[ 0., 1., 2., 3., 4.],
[ 5., 6., 7., 8., 9.],
[10., 11., 12., 13., 14.],
[15., 16., 17., 18., 19.]])
>>> b[0]
array([0., 1., 2., 3., 4.])
>>> b[1,1:3]array([6., 7.])
>>> b[1:2,1:3]
>>> b[1][1:3]
array([[6., 7.]])
array([6., 7.])
>>> b[:,3]= 3
>>> b
array([[ 0., 1., 2., 3., 4.],
[ 5., 6., 7., 3., 9.],
[10., 11., 12., 3., 14.],
[15., 16., 17., 3., 19.]])
>>> c = b[:,3].copy()
>>> c
array([3., 3., 3., 3.])
>>> b[1:3,2]
array([ 7., 12.])
>>> b[1:3,2:3]
array([[ 7.],
[12.]])
2、同型数组与数组的比较以及数组与标量的比较
- 无论哪种比较,比较的结果都是一个元素是布尔值的数组
- 此外,布尔值其实也可以与数字进行加减乘除的运算,布尔值可以互相间进行|,&
3、布尔索引
- 一维布尔数组可以用来索引数组或者相同大小的布尔数组可以索引数组
- 可以十分轻松方便的使用布尔数组索引来给目标数组设置想要的值
>>> b = np.eye(6)
>>> b
array([[1., 0., 0., 0., 0., 0.],
[0., 1., 0., 0., 0., 0.],
[0., 0., 1., 0., 0., 0.],
[0., 0., 0., 1., 0., 0.],
[0., 0., 0., 0., 1., 0.],
[0., 0., 0., 0., 0., 1.]])
>>> c = b == 1
>>> c
array([[ True, False, False, False, False, False],
[False, True, False, False, False, False],
[False, False, True, False, False, False],
[False, False, False, True, False, False],
[False, False, False, False, True, False],
[False, False, False, False, False, True]])
>>> b[c]
array([1., 1., 1., 1., 1., 1.])
>>> b
array([[1., 0., 0., 0., 0., 0.],
[0., 1., 0., 0., 0., 0.],
[0., 0., 1., 0., 0., 0.],
[0., 0., 0., 1., 0., 0.],
[0., 0., 0., 0., 1., 0.],
[0., 0., 0., 0., 0., 1.]])
>>> b[:4]
array([[1., 0., 0., 0., 0., 0.],
[0., 1., 0., 0., 0., 0.],
[0., 0., 1., 0., 0., 0.],
[0., 0., 0., 1., 0., 0.]])
>>> c = b[:4]
>>> c
array([[1., 0., 0., 0., 0., 0.],
[0., 1., 0., 0., 0., 0.],
[0., 0., 1., 0., 0., 0.],
[0., 0., 0., 1., 0., 0.]])
>>> c[c==0]
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0.])
>>> c[c==0] = 12
>>> c
array([[ 1., 12., 12., 12., 12., 12.],
[12., 1., 12., 12., 12., 12.],
[12., 12., 1., 12., 12., 12.],
[12., 12., 12., 1., 12., 12.]])
>>> c
array([[ 1., 12., 12., 12., 12., 12.],
[12., 1., 12., 12., 12., 12.],
[12., 12., 1., 12., 12., 12.],
[12., 12., 12., 1., 12., 12.]])
>>> f = np.array([True,False,True,False])
>>> f
array([ True, False, True, False])
>>> c[f]
array([[ 1., 12., 12., 12., 12., 12.],
[12., 12., 1., 12., 12., 12.]])
>>> f = np.array([True,True,True,False,False,False])
>>> f
array([ True, True, True, False, False, False])
>>> c[:,f]
array([[ 1., 12., 12.],
[12., 1., 12.],
[12., 12., 1.],
[12., 12., 12.]])
>>> c[1:3,f]
array([[12., 1., 12.],
[12., 12., 1.]])
>>> c
array([[ 1., 12., 12., 12., 12., 12.],
[12., 1., 12., 12., 12., 12.],
[12., 12., 1., 12., 12., 12.],
[12., 12., 12., 1., 12., 12.]])
>>> c[:,f] = 0
>>> c
array([[ 0., 0., 0., 12., 12., 12.],
[ 0., 0., 0., 12., 12., 12.],
[ 0., 0., 0., 12., 12., 12.],
[ 0., 0., 0., 1., 12., 12.]])
>>> c[c==0] = 1
>>> c
array([[ 1., 1., 1., 12., 12., 12.],
[ 1., 1., 1., 12., 12., 12.],
[ 1., 1., 1., 12., 12., 12.],
[ 1., 1., 1., 1., 12., 12.]])
4、花式索引
即通过整数列表或数组进行索引,花式索引可以实现数组不同行,不间隔行,不间隔列的摘取,并且可以重新对行列的顺序进行排列,十分好用。花式索引也可包括使用数组进行索引,只需把数组当成整数数列即可,所以经常有一维索引数组用来花式索引数组。
>>> a = np.arange(20).reshape(4,5)
>>> a
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19]])
>>> a[[3,0,1]]
array([[15, 16, 17, 18, 19],
[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9]])
>>> a[:,[3,1,0]]
array([[ 3, 1, 0],
[ 8, 6, 5],
[13, 11, 10],
[18, 16, 15]])
>>> a[1:3,[3,1,0]]
array([[ 8, 6, 5],
[13, 11, 10]])
>>> a[[3,2],[1,2]]
array([16, 12])
>>> a[[3,2]][:[1,2]]
Traceback (most recent call last):
File "<pyshell#196>", line 1, in <module>
a[[3,2]][:[1,2]]
TypeError: slice indices must be integers or None or have an __index__ method
>>> a[[3,2]][:,[1,2]]
array([[16, 17],
[11, 12]])
>>> a[[3,2]] = 0.4
>>> a
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]])
5、数组转置
即数组对象的.T方法和.transpose方法,记住:转置不进行任何复制操作
a
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]])
>>> a.T[0,0,:] = 100
>>> a
array([[[100, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[100, 13, 14, 15],
[ 16, 17, 18, 19],
[ 20, 21, 22, 23]]])
>>> a.T
array([[[100, 100],
[ 4, 16],
[ 8, 20]],
[[ 1, 13],
[ 5, 17],
[ 9, 21]],
[[ 2, 14],
[ 6, 18],
[ 10, 22]],
[[ 3, 15],
[ 7, 19],
[ 11, 23]]])