NumPy:一个第三方的Python模块,主要提供数值计算功能,大部分由C语言实现,在处理数组,矩阵等方面比单纯用Python实现快得多,提供了大量的矩阵运算的函数库,是用Python进行数值计算&DM&ML的好工具。
NumPy 的学习,也不能期望一步就都学会了,需要慢慢来吧,里面的内容很多,一次性都学了,不用的话忘得也快。
安装Python,NumPy,matplotlib,ipython,Scipy等。
导入Numpy模块:
from numpy import *
# import numpy as np
NumPy数组对象:
NumPy的数组对象被称作ndarray
,一般存储的都是同质的元素,即数组中元素类型都是一致的。
# 使用list创建一维数组
In [43]: a = array([1, 2, 3, 4, 5])
In [44]: a
Out[44]: array([1, 2, 3, 4, 5])
# 使用list创建二维数组
In [53]: b = array([[1, 2], [3, 4]])
In [54]: b
Out[54]:
array([[1, 2],
[3, 4]])
In [58]: c = arange(5) # 使用arange创建数组
In [59]: c
Out[59]: array([0, 1, 2, 3, 4])
# 生成2到10之间均匀步长的数组,默认生成50个元素
In [401]: linspace(2, 10)
# fill将c中的所有元素替换成给定元素
In [405]: c.fill(3)
In [406]: c
Out[406]: array([3, 3, 3, 3, 3])
我们可以通过下标获取数组中的元素。
# b = array([[1, 2], [3, 4]]),选择第一行第一个元素
In [55]: b[0, 0] # 还可以这样b[0][0]
Out[55]: 1
# 选择一行第二个元素
In [56]: b[0, 1]
Out[56]: 2
# 利用item函数可以完成同样的操作
In [364]: b.item((0, 1))
Out[364]: 2
# a = array([1, 2, 3, 4, 5])
# 返回数组元素对象类型
In [47]: a.dtype
Out[47]: dtype('int64')
# 数组的维度,m行n列的数组的shape为(m, n)
In [48]: a.shape
Out[48]: (5,)
# 数组中所有单个元素的个数
In [49]: a.size
Out[49]: 5
# 数组中每个元素的字节大小
In [50]: a.itemsize
Out[50]: 8
# 整个数组所占的空间大小
In [159]: a.nbytes
Out[159]: 40 # a.size * a.itemsize
# 秩
In [52]: a.ndim
Out[52]: 1
# 复数数组
In [165]: b = array([1 + 1.j, 3 + 2.j])
In [166]: b
Out[166]: array([ 1.+1.j, 3.+2.j])
# real
In [167]: b.real
Out[167]: array([ 1., 3.])
# imag
In [168]: b.imag
Out[168]: array([ 1., 2.])
# flat属性
In [171]: b
Out[171]:
array([[0, 1],
[2, 3]])
In [172]: f = b.flat # 返回一个扁平迭代器
In [173]: f
Out[173]: <numpy.flatiter at 0x102027a00>
In [175]: for i in f:
.....: print(i)
.....:
0
1
2
3
In [176]: f[3] # 可以按照扁平后的下标进行元素取值
Out[176]: 3
In [180]: b.flat = 7 # flat属性可赋值,赋值后整个数组元素将被覆盖
In [181]: b
Out[181]:
array([[7, 7],
[7, 7]])
一维数组的索引和切片和Python很类似:ndarry[start:stop:step]
Out[69]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
In [70]: a[:10:2]
Out[70]: array([0, 2, 4, 6, 8])
多维数组的切片和索引
假设数组b为2 * 3 * 4的三维数组,可看成2层楼,每层3行*4列排列的房间。
In [88]: b
Out[88]:
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]]])
# 通过三维坐标来选择b中任意一个元素:
In [95]: b[1, 2, 3] # 选择第1层,第2行,第3个元素
Out[95]: 23
# 可以用冒号`:`进行该维区间元素的选择
In [98]: b[:, 0:2, 0] # 选择所有楼层,第1和第2行的第1个元素
Out[98]:
array([[ 0, 4],
[12, 16]])
# `:`的切片作用同Python list
In [100]: b[0, 1, ::2] # 选择第1楼层,第2行,间隔1个元素取元素
Out[100]: array([4, 6])
# 多个`:`可以用`...`表示
In [99]: b[..., 0] # 选择所有楼层,所有行的第1列的元素
Out[99]:
array([[ 0, 4, 8],
[12, 16, 20]])
In [101]: b[:, 1] # 选择所有楼层,第2行的元素
Out[101]:
array([[ 4, 5, 6, 7],
[16, 17, 18, 19]])
# 将b中元素反转
In [107]: b[::-1, ::-1, ::-1] # 反转所有楼层,所有行,以及行中所有元素
Out[107]:
array([[[23, 22, 21, 20],
[19, 18, 17, 16],
[15, 14, 13, 12]],
[[11, 10, 9, 8],
[ 7, 6, 5, 4],
[ 3, 2, 1, 0]]])
使用ravel函数,进行数组平展
In [72]: b
Out[72]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
In [73]: b.ravel()
Out[73]: array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
使用flatten函数,进行数组展平
In [74]: b.flatten()
Out[74]: array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
使用reshape函数更改维度,一般用在数组初始化
In [76]: b.reshape(2, 6) # 不改变b数组
Out[76]:
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11]])
使用元组设置维度
In [78]: b.shape = (2, 6)
In [79]: b
Out[79]:
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11]])
使用转置函数transpose,或者它的另一种形式darray.T
In [81]: b.transpose() # 或 b.T
Out[81]:
array([[ 0, 6],
[ 1, 7],
[ 2, 8],
[ 3, 9],
[ 4, 10],
[ 5, 11]])
使用resize函数,功能同reshape,但是改变数组
In [85]: b.resize((3, 4))
In [86]: b
Out[86]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
NumPy数组之间有很多组合的方式。
假设我们有数组a,b
In [115]: a
Out[115]:
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
In [116]: b
Out[116]:
array([[ 0, 2, 4],
[ 6, 8, 10],
[12, 14, 16]])
水平组合
In [118]: hstack((a, b))
Out[118]:
array([[ 0, 1, 2, 0, 2, 4],
[ 3, 4, 5, 6, 8, 10],
[ 6, 7, 8, 12, 14, 16]])
In [119]: concatenate((a, b), axis=1) # axis设为0时即为下方垂直组合的效果
Out[119]:
array([[ 0, 1, 2, 0, 2, 4],
[ 3, 4, 5, 6, 8, 10],
[ 6, 7, 8, 12, 14, 16]])
垂直组合
In [120]: vstack((a, b))
Out[120]:
array([[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 0, 2, 4],
[ 6, 8, 10],
[12, 14, 16]])
深度组合
In [121]: dstack((a, b))
Out[121]:
array([[[ 0, 0],
[ 1, 2],
[ 2, 4]],
[[ 3, 6],
[ 4, 8],
[ 5, 10]],
[[ 6, 12],
[ 7, 14],
[ 8, 16]]])
列组合
In [122]: column_stack(([0, 0], [1, 2]))
Out[122]:
array([[0, 1],
[0, 2]])
行组合
In [123]: row_stack(([0, 0], [1, 2]))
Out[123]:
array([[0, 0],
[1, 2]])
水平分割
In [138]: a
Out[138]:
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
In [139]: hsplit(a, 3) # 将a沿着水平方向分割为3个大小相同的子数组
Out[139]:
[array([[0],
[3],
[6]]), array([[1],
[4],
[7]]), array([[2],
[5],
[8]])]
In [145]: split(a, 3, axis=1) # axis设为0时即为下面的垂直分割
Out[145]:
[array([[0],
[3],
[6]]), array([[1],
[4],
[7]]), array([[2],
[5],
[8]])]
垂直分割
In [147]: vsplit(a, 3)
Out[147]: [array([[0, 1, 2]]), array([[3, 4, 5]]), array([[6, 7, 8]])]
深度分割
In [156]: b
Out[156]:
array([[[ 0, 1, 2],
[ 3, 4, 5]],
[[ 6, 7, 8],
[ 9, 10, 11]]])
In [157]: dsplit(b, 3) # dsplit函数只能作用在3维或以上的数组上
Out[157]:
[array([[[0],
[3]],
[[6],
[9]]]), array([[[ 1],
[ 4]],
[[ 7],
[10]]]), array([[[ 2],
[ 5]],
[[ 8],
[11]]])]
==
# 将进行数组中元素的一一比较
In [129]: c == d
Out[129]: array([ True, False], dtype=bool)
In [183]: b.tolist() # 转换成list
Out[183]: [[7, 7], [7, 7]]
In [186]: b.astype(float) # 将原数组元素类型更改为float类型
Out[186]:
array([[ 7., 7.],
[ 7., 7.]])