1. 介绍
python本身含有列表和数组,但对于大数据来说,仍有不足,如不支持多维数组,也没有各种运算函数,不适合做数值运算。
NumPy弥补了这些不足,它提供了两种基本的对象:
ndarray:存储单一数据类型的多维数组
ufunc: 能够对数组进行处理的汗水
2. 生成ndarray的几种方式
2.1 从已有数据中创建
示例一:
import numpy as np
list1 = [1, 2, 3, 4]
nd1 = np.array(list1)
print(nd1)
print(type(nd1))
上述代码将数组转换为ndarray对象,输出如下:
[1 2 3 4]
示例二:
import numpy as np
list1 = [[1, 2, 3, 4], [5, 6, 7, 8]]
nd1 = np.array(list1)
print(nd1)
print(type(nd1))
输出如下:
[[1 2 3 4]
[5 6 7 8]]
2.2 利用random模块生成ndarray
random模块用于生成随机数,该模块又分为多种函数:
random():生产0到1之间的随机数
uniform(): 生成均匀分布随机数
randn() : 生成标准正态分布随机数
normal() : 生成正态分布
shuffle() : 随机打乱顺序
seed() :设置随机数种子
...
示例一:
import numpy as np
list1 = np.random.random([3, 3])
nd1 = np.array(list1)
print(nd1)
一开始我还没明白为啥写两遍random,后来才看出来,第一个意思是调用random模块,第二个是执行该模块内部的random方法;另外参数[3,3]表示生成3行3列的矩阵。最终输出如下:
[[0.33454586 0.61149299 0.85523208]
[0.28477909 0.60613214 0.25216937]
[0.47037521 0.06700554 0.1916976 ]]
2.3 创建特定形状的多维数组
示例如下:
import numpy as np
# 生成全是0的3*3的矩阵
nd1 = np.zeros([3, 3])
# 生成全是1的3*3的矩阵
nd2 = np.ones([3, 3])
# 生成3阶的单位矩阵
nd3 = np.eye(3)
# 生成3阶的对角矩阵
nd4 = np.diag([1, 2, 3])
print(nd1)
print(nd2)
print(nd3)
print(nd4)
最终输出结果如下:
[[0. 0. 0.]
[0. 0. 0.]
[0. 0. 0.]]
[[1. 1. 1.]
[1. 1. 1.]
[1. 1. 1.]]
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
[[1 0 0]
[0 2 0]
[0 0 3]]
2.4 利用arrange函数
arrange函数是numpy模块中的函数,其通过参数start, step,stop来设定范围和步长。其中start默认为0。示例如下:
import numpy as np
print(np.arange(10))
print(np.arange(0, 10))
print(np.arange(1, 4, 0.5))
print(np.arange(9, -1, -1))
输出如下:
[0 1 2 3 4 5 6 7 8 9]
[0 1 2 3 4 5 6 7 8 9]
[1. 1.5 2. 2.5 3. 3.5]
[9 8 7 6 5 4 3 2 1 0]
3. 存取元素
3.1 通过下标获取
示例一:
import numpy as np
# 生成10个随机数矩阵
nd1=np.random.random([10])
print(nd1)
#打印第3个元素
print(nd1[3])
# 打印第3到6个元素
print(nd1[3:6])
# 打印第1到6个元素,间隔2个元素打印一次
print(nd1[1:6:2])
# 逆序且间隔2个单位取一次元素
print(nd1[::-2])
最终输出结果如下:
[0.0941216 0.61965691 0.9426421 0.59370735 0.71552875
0.61783439 0.04356321 0.79254229 0.47524946 0.35386343]
0.5937073529078377
[0.59370735 0.71552875 0.61783439]
[0.61965691 0.59370735 0.61783439]
[0.35386343 0.79254229 0.61783439 0.59370735 0.61965691]
示例二:
import numpy as np
# 打印0到24的矩阵
nd2=np.arange(25).reshape([5,5])
print(nd2)
# 取1到3行,1到3列的子矩阵(3行3列不包括)
print(nd2[1:3,1:3])
# 取矩阵中打印3小于10的元素
print(nd2[(nd2>3)&(nd2<10)])
# 取0到1行的子矩阵
print(nd2[[0,1]])
# 取1到3列的子矩阵(不包括第3列)
print(nd2[:,1:3])
输出如下:
[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]
[15 16 17 18 19]
[20 21 22 23 24]]
[[ 6 7]
[11 12]]
[4 5 6 7 8 9]
[[0 1 2 3 4]
[5 6 7 8 9]]
[[ 1 2]
[ 6 7]
[11 12]
[16 17]
[21 22]]
3.2 通过choice函数获取
除了使用上述方法获取元素外,还可以使用random.choice()函数随机抽取元素。示例如下:
import numpy as np
from numpy import random as nr
# 生成0到24的矩阵
a=np.arange(1,25)
# 随机取出构成3行4列的矩阵,元素可重复取出
c1=nr.choice(a,size=(3,4))
print(c1)
# 随机取出构成3行4列的矩阵,元素不可重复取出
c2=nr.choice(a,size=(3,4),replace=False)
print(c2)
# 随机抽取构成3行4列的矩阵,设置每个元素被取出的概率
c3=nr.choice(a,size=(3,4),p=a/np.sum(a))
print(c3)
最终结果如下:
# 默认情况下choice方法取数可重复,如下中的6就有两个
[[ 5 9 16 4]
[ 6 6 18 10]
[ 9 22 13 7]]
# 设置为不重复取数
[[18 2 7 22]
[ 4 20 21 17]
[15 24 1 5]]
# 设置每个元素被取出的概率,该示例中数值越大被取出的概率越大
[[13 23 15 18]
[ 6 21 15 6]
[19 22 20 19]]
4. 矩阵操作
NumPy中提供了一些矩阵运算的方法,示例如下:
import numpy as np
# 生成0到8的矩阵
nd1=np.arange(9).reshape([3,3])
print(nd1)
# 矩阵转置
nd2=np.transpose(nd1)
print(nd2)
# 矩阵乘法
a=np.arange(12).reshape([3,4])
b=np.arange(8).reshape([4,2])
c=a.dot(b)
print(c)
# 求矩阵的迹
print(a.trace())
# 计算矩阵的行列式
print(np.linalg.det(nd1))
打印如下:
[[0 1 2]
[3 4 5]
[6 7 8]]
[[0 3 6]
[1 4 7]
[2 5 8]]
[[ 28 34]
[ 76 98]
[124 162]]
15
0.0
5. 数据合并与展开
5.1 合并一维数组
import numpy as np
a=np.array([1,2,3])
b=np.array([4,5,6])
c=np.append(a,b)
print(c)
d=np.concatenate([a,b])
print(d)
上述使用append方法或者concatenate方法都可以将一维数组进行合并。输出结果如下:
[1 2 3 4 5 6]
[1 2 3 4 5 6]
5.2 多维数组的合并
import numpy as np
a=np.arange(4).reshape(2,2)
b=np.arange(4).reshape(2,2)
# 按行将两个矩阵合并
c=np.append(a,b,axis=0)
print(c)
print("c的维度为:",c.shape)
# 按列将两个矩阵合并
d=np.append(a,b,axis=1)
print(d)
print("d的维度为:",d.shape)
输出结果如下:
[[0 1]
[2 3]
[0 1]
[2 3]]
c的维度为: (4, 2)
[[0 1 0 1]
[2 3 2 3]]
d的维度为: (2, 4)
5.3 矩阵展平
示例代码如下:
import numpy as np
nd1=np.arange(6).reshape(2,-1)
print(nd1)
# 按列展开
nd2=nd1.ravel('F');
print(nd2)
# 按行展开
nd3=nd1.ravel()
print(nd3)
输出结果如下:
[[0 1 2]
[3 4 5]]
[0 3 1 4 2 5]
[0 1 2 3 4 5]
使用ravel方法展开成一行。
6. 通用函数
前面一直介绍NumPy中的ndarray对象,下面再介绍ufunc对象,它是universal function的缩写。它可以对数组的每一个元素进行操作,避免了利用向量或矩阵时的循环语句。ufunc函数是一个统称,具有有sqrt,sin,cos,abs,dot等各种类型的运算函数。相比于math库的运算函数,ufunc函数速度更快,效率更高。
如使用sin函数:
import numpy as np
nd1=np.arange(6).reshape(2,-1)
print(np.sin(nd1))
直接将矩阵作为参数传递,结果如下:
[[ 0. 0.84147098 0.90929743]
[ 0.14112001 -0.7568025 -0.95892427]]
7. 广播机制
下面是一个广播机制的示例:
import numpy as np
a=np.arange(10).reshape([5,2])
b=np.arange(2).reshape([1,2])
print(a+b)
示例中对一个5行2列的矩阵和一个1行2列的矩阵做加法。数学上两个矩阵的行列数要一致才可以做加减法,示例中是不对的,但是广播机制先对b进行复制扩充为5行2列的矩阵,第0列都为0,第1列都为1,这样两个5行2列的矩阵就可以做加法了,输出结果如下:
[[ 0 2]
[ 2 4]
[ 4 6]
[ 6 8]
[ 8 10]]