python科学计算工具包numpy简介
numpy是python中非常常见且特别强大的科学计算工具包,它具有强大的N维数组对象:ndarray,可以对数组结构整体进行运算(如矩阵计算),不用循环遍历整个数组,同时可以产生随机数、线性代数、 傅里叶变换等科学操作,十分方便。
关于numpy的功能我不再过多介绍,接下来将简单介绍numpy的基础用法
1. numpy的基础数据结构
-
创建数组
-
array()
函数:可以将列表、元组、生成器等创建数组 -
arange()
函数:用法类似于range()函数 -
linspace()
函数:返回含有[start, end]区间内num个均匀间隔元素的数组用法:
linspace(start, end, num, endpoint=True, retstep=False)
endpoint:是否包含最后一个值end,默认为True
retstep:输出(结果, 步长)的一个元组,默认为False
-
zeros()
函数:创建n个元素均为0的数组用法:
zeros(shape, dtype='float64')
衍生:
zeros_like()
生成一个与另外一个数组形状相同的用0填充的数组 -
ones()
函数:与zeros()
函数很相似,只不过是用1填充 -
eyes()
函数:生成一个N*N的单位矩阵(对角线为1,其他位置为0)# Example1 >>> import numpy as np >>> a1 = np.array([1, 2, 3, 4]) # 一维数组 >>> a2 = np.array(((1, 2), (3, 4))) # 二维数组 >>> print(a1) [1 2 3 4] >>> print(a2) [[1 2] [3 4]] # Tips: numpy的array与python普通数据结构list,tuple的最直接区别就是数据之间没有逗号分隔 # Example2 >>> import numpy as np >>> b = np.arange(0, 10, 2) >>> print(b) [0 2 4 6 8] # Tips: range()函数的(起点,终点,步长)的用法同样适用于arange() #Example3 >>> c1 = np.linspace(1, 10, 19) >>> print(c1) [ 1. 1.5 2. 2.5 3. 3.5 4. 4.5 5. 5.5 6. 6.5 7. 7.5 8. 8.5 9. 9.5 10. ] >>> >>> c2 = np.linspace(1, 5, 4, endpoint=False, retstep=True) >>> print(c2) (array([1., 2., 3., 4.]), 1.0) # Example4 >>> d1 = np.zeros(5) >>> print(d1) [0. 0. 0. 0. 0.] >>> d2 = np.zeros((2, 3)) >>> print(d2) [[0. 0. 0.] [0. 0. 0.]] >>> print(d2.dtype) float64 >>> d3 = np.array([[1, 2], [4, 5]]) >>> d4 = np.zeros_like(d3) >>> print(d4) [[0 0] [0 0]] # Example5 >>> e = np.eye(5) >>> print(e) [[1. 0. 0. 0. 0.] [0. 1. 0. 0. 0.] [0. 0. 1. 0. 0.] [0. 0. 0. 1. 0.] [0. 0. 0. 0. 1.]]
-
-
数组array常见的几个方法
-
ndim
:返回数组的维度,也称rank -
shape
方法:返回数组的形状,如二维数组返回的就是x行y列 -
size
方法:返回数组中全部元素的个数 -
dtype
方法:看元素的数据类型 -
itemsize
方法:每个元素占用的字节大小 -
data
方法:数组对应的内存缓存区>>> import numpy as np >>> a = np.array([[1, 2, 3], [4, 5, 6]]) >>> print(a.ndim) 2 >>> print(a.shape) (2, 3) >>> print(a.size) 6 >>> print(a.dtype) int32 >>> print(a.itemsize) 4 >>> print(a.data) <memory at 0x00000205B733BD68>
-
2. numpy的常用函数、方法
改变数组形状
-
转置
numpy中用
.T
对数组转置(一维数组转置无效)>>> import numpy as np >>> a = np.array([[1, 2, 3], [4, 5, 6]]) >>> print(a) [[1 2 3] [4 5 6]] >>> b = a.T >>> print(b) [[1 4] [2 5] [3 6]]
-
改变数组形状(元素个数必须对应):
reshape()
用
.reshape(x, y)
改变数组形状为一个x行y列的数组,注意元素个数必须一样,否则会报错Tips:
.reshape()
方法会返回一个新数组,而不会改变数组本身>>> a = np.arange(10).reshape(2, 5) >>> print(a) [[0 1 2 3 4] [5 6 7 8 9]] >>> print(a.shape) (2, 5) # 方法2 >>> a = np.arange(10) >>> b = np.reshape(a, (2, 5)) >>> print(b) [[0 1 2 3 4] [5 6 7 8 9]]
-
改变数组形状(元素个数不用对应):
resize()
Tips:
.resize()
方法会改变数组本身>>> a = np.arange(10) >>> print(np.resize(a, (3, 3))) [[0 1 2] [3 4 5] [6 7 8]] # 元素多余时舍掉 >>> print(np.resize(a, (4, 4))) [[0 1 2 3] [4 5 6 7] [8 9 0 1] [2 3 4 5]] # 元素不足时重复已有元素
-
reshape()
与resize()
对比>>> a = np.arange(10) >>> print(a.reshape(2, 5)) [[0 1 2 3 4] [5 6 7 8 9]] >>> print(a.resize(2, 4)) None >>> print(a) [[0 1 2 3] [4 5 6 7]] # 这是因为reshape返回一个新的数组,而resize不会,他会改变原数组 # 为了使resize也返回一个新的数组,需要使用np.resize() >>> a = np.arange(10) >>> print(np.reshape(a, (2, 5))) [[0 1 2 3 4] [5 6 7 8 9]] >>> print(np.resize(a, (2, 3))) [[0 1 2] [3 4 5]] >>> print(a) [0 1 2 3 4 5 6 7 8 9] # 此时resize不会改变原来的数组了
数组中元素类型的转换
.astype()
可以改变数组中元素的类型
>>> a = np.arange(5, dtype=int)
>>> b = a.astype(np.float)
>>> print(a.dtype, b.dtype)
int32 float64
数组的简单运算
数组有加减乘除运算,规则与矩阵的加减乘除一致。
>>> a = np.arange(10).reshape(2, 5)
>>> print(a)
[[0 1 2 3 4]
[5 6 7 8 9]]
>>> print(a + 10)
[[10 11 12 13 14]
[15 16 17 18 19]]
>>> print(a - 10)
[[-10 -9 -8 -7 -6]
[ -5 -4 -3 -2 -1]]
>>> print(a * 10)
[[ 0 10 20 30 40]
[50 60 70 80 90]]
>>> print(a / 10)
[[0. 0.1 0.2 0.3 0.4]
[0.5 0.6 0.7 0.8 0.9]]
>>> print(a.mean())
4.5
>>> print(a.max())
9
>>> print(a.min())
0
>>> print(a.std()) # 求标准差
2.8722813232690143
>>> print(a.var()) # 求方差
8.25
>>> print(a.sum())
45
>>> print(np.sum(a, axis=0)) # axis=0,按列求和,axis=1,按行求和
[ 5 7 9 11 13]