1.1 如何生成数组,ndarray
使用array函数生成:
1list = [1,2,3,45,6,7,8]
2arr1 = np.array(list)
3
4>>>array([ 1, 2, 3, 45, 6, 7, 8])
还有zeros,ones函数:
1>>> np.zeros(5)
2array([0., 0., 0., 0., 0.])
1>>> np.zeros((2,3))
2array([[0., 0., 0.],
3 [0., 0., 0.]])
1>>> np.ones(10)
2array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
arange函数:
1>>> np.arange(12)
2array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
1.2 数据类型可以使用astype进行转换
1>>> arr= np.array([1,2,3,4,5,6,7,8,9])
2
3>>> arr.dtype
4dtype('int32')
5
6>>> float_arr = arr.astype(np.float64)
7
8>>> float_arr.dtype
9dtype('float64')
1.3 numpy数组运算
1>>> arr = np.array([[4,5,6,8],[1,2,3,4]])
2
3>>> arr
4array([[4, 5, 6, 8],
5 [1, 2, 3, 4]])
6
7>>> arr*arr
8array([[16, 25, 36, 64],
9 [ 1, 4, 9, 16]])
10
11>>> arr-arr
12array([[0, 0, 0, 0],
13 [0, 0, 0, 0]])
14
15>>> 1/arr
16array([[0.25 , 0.2 , 0.16666667, 0.125 ],
17 [1. , 0.5 , 0.33333333, 0.25 ]])
18
19
20>>> arr*0.5
21array([[2. , 2.5, 3. , 4. ],
22 [0.5, 1. , 1.5, 2. ]])
同尺寸数组之间比较,会产生一个布尔值数组。不同尺寸之间的操作则会使用到广播特性。
1.4 索引与切片
一维数组的切片看起来和列表一个样子。
1>>> arr = np.arange(15)
2>>> arr
3array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
4
5>>> arr[2:5]
6array([2, 3, 4])
数组的切片是是个原数组的视图,任何对视图的修改都会反映到原数组上。
1>>> arr[0:4] = 5
2>>> arr
3array([ 5, 5, 5, 5, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
对于高维数组,每个索引值对应的元素是一维数组。
1>>> arr2d = np.array([[1,2,3],[4,5,6],[7,8,9]])
2
3>>> arr2d[2]
4array([7, 8, 9])
1>>> arr2d[2][0]
2 7
numpy 的多维数组中,要注意原数组的维度进行索引值的设置,否者容易出错。
来感受一下区别:
arr3d = np.arange(12).reshape((2,2,3))
>>> arr3d
array([[[ 0, 1, 2],
[ 3, 4, 5]],
[[ 6, 7, 8],
[ 9, 10, 11]]])
>>> arr3d[0]
array([[0, 1, 2],
[3, 4, 5]])
>>> arr3d[1,0]
array([6, 7, 8])
>>> arr3d[1,0,0]
6
多维数组的切片,类似于从高维往低维递进的一个过程。比如:
>>> arr3d[:1]
array([[[0, 1, 2],
[3, 4, 5]]])
>>> arr3d[:1,:1]
array([[[0, 1, 2]]])
>>> arr3d[:1,:1,:1]
array([[[0]]])
>>> arr3d[:1,1]
array([[3, 4, 5]])
>>> arr3d[:,:,1]
array([[ 1, 4],
[ 7, 10]])
1.5 布尔索引
布尔值数组长度必须与数组轴索引长度一致,当布尔值数组长度不确定时,并不会报错,所以要当心。
>>> arr = np.arange(15).reshape((5,3))
>>> arr
array([[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11],
[12, 13, 14]])
>>> arr_bool = np.array([True, False,True,True,False])
>>> arr[arr_bool]
array([[ 0, 1, 2],
[ 6, 7, 8],
[ 9, 10, 11]])
可以对多个布尔值条件进行联合,如&或者|, 对于布尔数组,pytrhon 的关键字and 和 or 并不管用。而且使用布尔索引时总是生成数据的拷贝。
基于一般的常识来设置布尔数组也是可行的:
>>> arr[arr>5]
array([ 6, 7, 8, 9, 10, 11, 12, 13, 14])
1.6 神奇索引
神奇索引时numpy是术语,用于描述使用整数数组进行数据索引。
>>> arr
array([[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11],
[12, 13, 14]])
>>> arr[[4,0,1,2]]
array([[12, 13, 14],
[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8]])
#传入多个索引数组
>>> arr[[0,1,2,3,4],[0,1,2,2,0]]
array([ 0, 4, 8, 11, 12])
#取到位置(0,0),(1,1),(2,2),(3,2),(4,0)的值
1.7 数组的转置和换轴
我的理解和线性代数上的转置是一个道理,行列互换。
数组有transpose方法,也有特殊的T属性。
>>> arr
array([[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11],
[12, 13, 14]])
>>> arr.T
array([[ 0, 3, 6, 9, 12],
[ 1, 4, 7, 10, 13],
[ 2, 5, 8, 11, 14]])
进行矩阵计算,比如进行内积计算会用到:np.dot()
>>> arr
array([[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11],
[12, 13, 14]])
>>> arr.T
array([[ 0, 3, 6, 9, 12],
[ 1, 4, 7, 10, 13],
[ 2, 5, 8, 11, 14]])
>>> arr_dot = np.dot(arr.T, arr)
>>> arr_dot
array([[270, 300, 330],
[300, 335, 370],
[330, 370, 410]])
>>>
对于更高维的数组,transpose方法可以接受包含轴编号的元组,用于置换轴:
>>> ar = np.arange(16).reshape((2,2,4))
>>> ar
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7]],
[[ 8, 9, 10, 11],
[12, 13, 14, 15]]])
>>> ar.transpose((1,0,2))
array([[[ 0, 1, 2, 3],
[ 8, 9, 10, 11]],
[[ 4, 5, 6, 7],
[12, 13, 14, 15]]])
ndarray有一个swapaxes方法,该方法接受一对编号作为参数,并对轴进行调整用于数据重组。
>>> ar
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7]],
[[ 8, 9, 10, 11],
[12, 13, 14, 15]]])
>>> ar.swapaxes(1,2)
array([[[ 0, 4],
[ 1, 5],
[ 2, 6],
[ 3, 7]],
[[ 8, 12],
[ 9, 13],
[10, 14],
[11, 15]]])