目录
什么是Numpy?
NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。
NumPy 的前身 Numeric 最早是由 Jim Hugunin 与其它协作者共同开发,2005 年,Travis Oliphant 在 Numeric 中结合了另一个同性质的程序库 Numarray 的特色,并加入了其它扩展而开发了 NumPy。NumPy 为开放源代码并且由许多协作者共同维护开发。
NumPy 是一个运行速度非常快的数学库,主要用于数组计算,包含:
- 一个强大的N维数组对象 ndarray
- 广播功能函数
- 整合 C/C++/Fortran 代码的工具
- 线性代数、傅里叶变换、随机数生成等功能
关于Numpy的运行速度为什么快?
因为Numpy的最底层是用C语言来写的,我们都知道C语言的运行速度是十分的强大,所以我们在用Numpy进行矩阵的运算或者合并等操作时,运行速度比用Python创建矩阵和数组然后计算的速度要快得多。
Numpy的一些基本操作
一、用Numpy创建第一个数组
numpy.arrary(shape, dtype = float)
参数说明:
- shape–创建的数组
- dtype–数组的类型
import numpy as np
a = np.array([2, 23, 4], dtype=np.int) # 创建一个整型的数组
print(a)
[ 2 23 4]
import numpy as np
a = np.array([2, 23, 4], dtype=np.float) # 创建一个整型的数组
print(a)
[ 2. 23. 4.]
import numpy as np
a = np.array([2, 23, 4], dtype=np.complex) # 创建一个整型的数组
print(a)
[ 2.+0.j 23.+0.j 4.+0.j]
二、Numpy的数组的一些基本属性
- ndarray.ndim - 数组的轴(维度)的个数。在Python世界中,维度的数量被称为rank。
- ndarray.shape - 数组的维度。这是一个整数的元组,表示每个维度中数组的大小。对于有 n 行和 m 列的矩阵,shape 将是 (n,m)。因此,shape 元组的长度就是rank或维度的个数 ndim。
- ndarray.size - 数组元素的总数。这等于 shape 的元素的乘积。
- ndarray.dtype - 一个描述数组中元素类型的对象。可以使用标准的Python类型创建或指定dtype。另外NumPy提供它自己的类型。例如numpy.int32、numpy.int16和numpy.float64。
- ndarray.itemsize - 数组中每个元素的字节大小。例如,元素为 float64 类型的数组的 itemsize 为8(=64/8),而 complex32 类型的数组的 itemsize 为4(=32/8)。它等于 ndarray.dtype.itemsize 。
- ndarray.data - 该缓冲区包含数组的实际元素。通常,我们不需要使用此属性,因为我们将使用索引访问数组中的元素。
三、Numpy数组的一些简单操作
- zeros–表示数组中的元素都是0
- ones–表示数组中的元素都是1
- empty–表示数组中的元素都是复数
a = np.zeros((3, 4), dtype=np.int)
print(a)
[[0 0 0 0]
[0 0 0 0]
[0 0 0 0]]
a = np.ones((3, 4), dtype=np.int)
print(a)
[[1 1 1 1]
[1 1 1 1]
[1 1 1 1]]
a = np.empty((3, 4))
print(a)
[[3.51988719e+016 8.23900250e+015 1.17316622e+079 7.49229521e+247]
[2.21210356e+214 3.50849418e+016 1.31531594e-047 7.32845376e+025]
[1.71130458e+059 1.62980191e+045 2.67108442e+098 1.42681594e-312]]
a = np.arange(10, 20, 2) # 定义从10到20(左开右闭),间隔为2的数组
print(a)
[10 12 14 16 18]
a = np.linspace(1, 10, 4) # 把1到10等分成4份(每个数字之间的间隔都是相同的),然后输出
print(a)
[ 1. 4. 7. 10.]
四、用Numpy进行矩阵的运算
- dot(a,b)函数–表示将a矩阵与b矩阵进行矩阵的运算
- a.dot(b)函数–表示将a矩阵与b矩阵进行矩阵的运算
a = np.array([[1, 1],
[0, 1]])
b = np.arange(4).reshape((2, 2))
c = a * b
c_dot = np.dot(a, b) # dot表示矩阵的运算
#c_dot = a.dot(b) # dot表示矩阵的运算
print(c)
print(c_dot)
[[0 1]
[0 3]]
[[2 4]
[2 3]]
- sum(a)–求a矩阵中所有元素的总和
- min(a)–求a矩阵中所有元素的最小值
- max(a)–求a矩阵中所有元素的最大值
a = np.random.random((2,2))
print(a)
print(np.sum(a))
print(np.min(a))
print(np.max(a))
[[0.37261234 0.89570521]
[0.86988402 0.58789557]]
2.7260971342420617
0.3726123374803223
0.8957052061265958
A = np.arange(2,14).reshape((3,4))
print(np.argmin(A))
print(np.argmax(A))
0
11
A = np.arange(2,14).reshape((3,4))
print(f'对于行进行计算的数值:{np.mean(A,axis=1)}') # 计算平均值 axis = 1对于 行 进行计算
print(f'对于列进行计算的数值:{np.average(A,axis=0)}') # 计算平均值 axis = 0对于 列 进行计算
print(np.median(A)) # 计算中位数
对于行进行计算的数值:[ 3.5 7.5 11.5]
对于列进行计算的数值:[6. 7. 8. 9.]
7.5
A = np.arange(2,14).reshape((3,4))
print(np.cumsum(A)) # 输出累加的值!!!!!
print(np.diff(A)) # 输出累差的值!!!!!
print(np.nonzero(A)) # 输出非0的坐标!!!!
print(np.sort(A)) # 对矩阵进行排序!!!!
[ 2 5 9 14 20 27 35 44 54 65 77 90]
[[1 1 1]
[1 1 1]
[1 1 1]]
(array([0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2], dtype=int32), array([0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3], dtype=int32)) # 这个坐标是前面的每一个与后面的每一个构成一个完整的坐标。
[[ 2 3 4 5]
[ 6 7 8 9]
[10 11 12 13]]
A = np.arange(2,14).reshape((3,4))
print(np.transpose(A)) # 对矩阵进行转置操作!!!!
print(np.clip(A,5,9)) # 小于5的数直接取5,大于9的数直接取9,保留处在5和9之间的数字
[[ 2 6 10]
[ 3 7 11]
[ 4 8 12]
[ 5 9 13]]
[[5 5 5 5]
[6 7 8 9]
[9 9 9 9]]
五、Numpy的索引操作
a = np.arange(10)
print(a[2:7:2]) # 表示从2到7进行切片,间隔为2
x = np.array([[1, 2], [3, 4], [5, 6]])
y = x[[0,1,2], [0,1,0]] # 获取数组中(0,0),(1,1)和(2,0)位置处的元素。
print (y)
[2 4 6]
[1 4 5]
a = np.arange(3,15).reshape((3,4))
print(a)
print(a[2])
print(a.T) # 矩阵a的转置
[[ 3 4 5 6]
[ 7 8 9 10]
[11 12 13 14]]
[11 12 13 14]
[[ 3 7 11]
[ 4 8 12]
[ 5 9 13]
[ 6 10 14]]
a = np.arange(3,15).reshape((3,4))
for row in a:
print(row) # 输出每行
for colunmn in a.T:
print(colunmn) # 输出每列
[3 4 5 6]
[ 7 8 9 10]
[11 12 13 14]
[ 3 7 11]
[ 4 8 12]
[ 5 9 13]
[ 6 10 14]
a = np.arange(3,15).reshape((3,4))
print(a.flatten())
for item in a.flat:
print(item) # 输出矩阵中的每个元素
[ 3 4 5 6 7 8 9 10 11 12 13 14]
3
4
5
6
7
8
9
10
11
12
13
14
六、Numpy的数组的合并操作
a = np.array([1, 1, 1])
b = np.array([2, 2, 2])
print(np.vstack((a, b))) # 数组a和数组b的合并(上下合并)
d = np.hstack((a, b)) # 数组a和数组b的合并(左右合并)
print(d)
[[1 1 1]
[2 2 2]]
[1 1 1 2 2 2]
a = np.array([1, 1, 1])
b = np.array([2, 2, 2])
print(a[:, np.newaxis])
print(a[:, np.newaxis].shape) # 在后面加上了一个维度
print(a[np.newaxis, :].shape) # 在前面加上了一个维度
[[1]
[1]
[1]]
(3, 1)
(1, 3)
a = np.array([1, 1, 1])[:, np.newaxis]
b = np.array([2, 2, 2])[:, np.newaxis]
print(a)
print(b)
c = np.vstack((a, b)) # 数组a和数组b的合并(上下合并)
print(c)
d = np.hstack((a, b)) # 数组a和数组b的合并(左右合并)
print(d)
[[1]
[1]
[1]]
[[2]
[2]
[2]]
[[1]
[1]
[1]
[2]
[2]
[2]]
[[1 2]
[1 2]
[1 2]]
a = np.array([1, 1, 1])[:, np.newaxis]
b = np.array([2, 2, 2])[:, np.newaxis]
c = np.concatenate((a, b, b, a), axis=1) # 横向合并
print(c)
d = np.concatenate((a, b, b, a), axis=0) # 纵向合并
print(d)
[[1 2 2 1]
[1 2 2 1]
[1 2 2 1]]
[[1]
[1]
[1]
[2]
[2]
[2]
[2]
[2]
[2]
[1]
[1]
[1]]
七、Numpy的array的分割
a = np.arange(12).reshape((3, 4))
print(a)
print(np.split(a, 3, axis=0)) # 横向分割
print(np.vsplit(a, 3)) # 横向分割
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]])]
[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]])]
a = np.arange(12).reshape((3, 4))
print(a)
print(np.split(a, 4, axis=1)) # 纵向分割
print(np.hsplit(a, 2)) # 纵向分割
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[array([[0],
[4],
[8]]), array([[1],
[5],
[9]]), array([[ 2],
[ 6],
[10]]), array([[ 3],
[ 7],
[11]])]
[array([[0, 1],
[4, 5],
[8, 9]]), array([[ 2, 3],
[ 6, 7],
[10, 11]])]
Process finished with exit code 0
八、Numpy的copy
# numpy的copy
a = np.arange(4)
print(f'改变前的a:{a}')
b = a
c = a
d = b
a[0] = 11
# a,b,c,d四个变量都是互相关联的,改变了一个,其余的三个都会被改变
print(f'改变后的a:{a}')
print(f'随之改变的b:{b}\n随之改变的c:{c}')
b = a.copy()
a[3] = 21
print(f'copy a 后的b的数组不变:{b}')
print(f'a的数组的值改变了:{a}')
改变前的a:[0 1 2 3]
改变后的a:[11 1 2 3]
随之改变的b:[11 1 2 3]
随之改变的c:[11 1 2 3]
copy a 后的b的数组不变:[11 1 2 3]
a的数组的值改变了:[11 1 2 21]