上篇文章我们讲到了NumPy的创建、算术运算及广播特性。这篇文章我们将继续学习NumPy。

01基础索引与切片

ndarray对象的内容可以通过索引或切片来访问和修改,与 Python 中 list 的切片操作一样。

import numpy as np
arr = np.arange(10)
print(arr)
print(arr[5])
print(arr[2:5])
print(arr[5:])
print(arr[:3])

结果如下:

python ndarray操作nan ndarray取值_python

区别于Python的内建列表,数组的切片是原数组的视图。这意味着数据并不是被复制了,任何对于视图的修改都会反映到原数组上。

如果想要数组切片的拷贝而不是视图,就需要显式调用arr[x:y].copy()

ndarray 数组可以基于 0 - n 的下标进行索引,切片对象可以通过内置的 slice 函数,并设置 start, stop 及 step 参数进行,从原数组中切割出一个新数组。

a = np.arange(10)
s = slice(2,7,2)   # 从索引 2 开始到索引 7 停止,间隔为2
print (a[s])

在二维数组中,每个索引值对应的元素不再是一个值,而是一个一维数组:

arr2d = np.array([[1,2,3],[4,5,6],[7,8,9]])
print(arr2d)
print(arr2d[2])
# 下面两种方式效果一样
print(arr2d[0][2])
print(arr2d[0, 2])

输出如下:

python ndarray操作nan ndarray取值_数组_02

在展示二维数组的索引上,我们可以将“0”轴看做行,“1”轴看做列。

数组的切片索引

思考一下: 下面二维数组的切片意味着什么?

print(arr2d[:2])
print(arr2d[:2,1:])

python ndarray操作nan ndarray取值_python_03

数组沿着轴0进行了切片。表达式arr2d[:2]的含义为选择arr2d的前两行。

02 布尔索引

我们可以通过一个布尔数组来索引目标数组。

布尔索引通过布尔运算(如:比较运算符)来获取符合指定条件的元素的数组。

以下实例获取大于 5 的元素:

x = np.array([[  0,  1,  2],[  3,  4,  5],[  6,  7,  8],[  9,  10,  11]])  
print ('我们的数组是:')
print (x)
print ('\n')
# 现在我们会打印出大于 5 的元素  
print  ('大于 5 的元素是:')
print (x >  5)
print(x[ x > 5 ])

结果如下:

python ndarray操作nan ndarray取值_2d_04

可以使用!=~对条件取反。如:

print(x[~(x > 5)])

python ndarray操作nan ndarray取值_2d_05

多个条件并列时,可以使用&|进行连接。

03 神奇索引

神奇索引(花式索引)是NumPy中的术语,用于描述使用整数数组进行数据索引。

花式索引根据索引数组的值作为目标数组的某个轴的下标来取值。

对于使用一维整型数组作为索引,如果目标是一维数组,那么索引的结果就是对应位置的元素;

如果目标是二维数组,那么就是对应下标的行。

花式索引跟切片不一样,它总是将数据复制到新数组中。

arr1 = np.arange(32).reshape((8,4))
print(arr1)
print("------------1--------------")
print(arr1[[4,2,5,1]])
print("------------2--------------")
print(arr1[[-2,-1,-5,-3]])
print("------------3--------------")
print(arr1[[1,5,7,2],[0,3,1,2]])

结果:

python ndarray操作nan ndarray取值_python ndarray操作nan_06

04 数组转置和换轴

转置是一种特殊的数据重组形式,可以返回底层数据的视图而不需要复制任何内容。

数组拥有transpose方法,也有特殊的T属性。

arr2 = np.arange(15).reshape((3,5))
print("----转置前------")
print(arr2)
print("----转置后------")
print(arr2.T)

python ndarray操作nan ndarray取值_python_07

arr3 = np.arange(16).reshape((2,2,4))
print("--------转换前-------")
print(arr3)
print("--------转换后-------")
print(arr3.transpose(2,1,0))

python ndarray操作nan ndarray取值_python_08

转换规则:

0 [0,0,0] [0,0,0]
1 [0,0,1] [1,0,0]
2 [0,0,2] [2,0,0]
3 [0,0,3] [3,0,0]
4 [0,1,0] [0,1,0]
5 [0,1,1] [1,1,0]
6 [0,1,2] [2,1,0]
7 [0,1,3] [3,1,0]
8 [1,0,0] [0,0,1]
9 [1,0,1] [1,0,1]
10 [1,0,2] [2,0,1]
11 [1,0,3] [3,0,1]
12 [1,1,0] [0,1,1]
13 [1,1,1] [1,1,1]
14 [1,1,2] [2,1,1]
15 [1,1,3] [3,1,1]

其中第一列是值,第二列是转置前位置,第三列是转置后,看到转置后位置。

再例如:

print(arr2.transpose(1,0,2))

结果如下:

python ndarray操作nan ndarray取值_转置_09

将轴转换:

0 [0,0,0] [0,0,0]
1 [0,0,1] [0,0,1]
2 [0,0,2] [0,0,2]
3 [0,0,3] [0,0,3]
4 [0,1,0] [1,0,0]
5 [0,1,1] [1,0,1]
6 [0,1,2] [1,0,2]
7 [0,1,3] [1,0,3]
8 [1,0,0] [0,1,0]
9 [1,0,1] [0,1,1]
10 [1,0,2] [0,1,2]
11 [1,0,3] [0,1,3]
12 [1,1,0] [1,1,0]
13 [1,1,1] [1,1,1]
14 [1,1,2] [1,1,2]
15 [1,1,3] [1,1,3]

swapaxes函数用于交换数组的两个轴,格式如下:

numpy.swapaxes(arr, axis1, axis2)
  • arr:输入的数组
  • axis1:对应第一个轴的整数
  • axis2:对应第二个轴的整数

举例:

a = np.arange(8).reshape(2,2,2)

print ('原数组:')
print (a)
print ('\n')

print ('调用 swapaxes 函数后的数组:')
print (np.swapaxes(a, 2, 0))

结果:

python ndarray操作nan ndarray取值_转置_10