一、概念:
NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。
NumPy 是一个运行速度非常快的数学库,主要用于数组计算,包含:
一个强大的N维数组对象 ndarray
广播功能函数
整合 C/C++/Fortran 代码的工具
线性代数、傅里叶变换、随机数生成等功能
二、代码详解
1.数组属性
np.array是numpy定义数组的语句
属性 | 说明 |
---|---|
ndattay.ndim | 秩,即轴的数量或维度的数量 |
ndattay.shape | 数组的维度,对于矩阵,n行n列 |
ndattay.size | 数组元素的总个数,相当于shape中的n* m的值 |
ndattay.dtype | ndarray对象的元素类型 |
import numpy as np
array = np.array([[1,2,3],[4,5,6]]) #定义矩阵
print(array)
print("number of dim:",array.ndim ) # 维度
print('shape:', array.shape) # 形状,几行几列
print('size:',array.size) # 元素个数
结果:
[[1 2 3]
[4 5 6]]
number of dim: 2
shape: (2, 3)
size: 6
2.创建array
np.array([2,25,4],dtype=np.float32)
创建array时,加dtype属性可以定义数据的类型
numpy 的数值类型实际上是 dtype 对象的实例,并对应唯一的字符,包括 np.bool_,np.int32,np.float32,等等。
aa = np.array([2,25,4],dtype=np.float32) # dtype 定义数据类型
print(aa.dtype)
结果:
float32
定义矩阵
a = np.array([[1,56,2], # 定义矩阵
[4,5,6]])
print(a)
结果:
[[ 1 56 2]
[ 4 5 6]]
定义全零的矩阵
b = np.zeros((3,4)) # 全零的矩阵
print(b)
结果:
[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]
定义全1的矩阵
c = np.ones((3,4),dtype=np.int16) # 全1的矩阵
print(c)
结果:
[[1 1 1 1]
[1 1 1 1]
[1 1 1 1]]
定义空的矩阵
什么都没有的矩阵,其实它的值接近于0
d = np.empty((3,4)) # 什么都没有的矩阵,各项值近似于零
print(d)
结果;
[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]
定义列表
定义从10到20,步数为2的列表,并且reshape可以重新定义矩阵的形状
e = np.arange(10,20,2) # 定义从10到20,步数为2的列表
print(e)
f = np.arange(12).reshape((3,4)) # reshape 重新定义矩阵的形状 行和列
print(f)
结果:
[10 12 14 16 18]
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
定义段长
定义段长,和arange很相似,只是把第三个参数步长改成分割成多少个部分,也就是这一组数据的个数。
通过reshape可以改变形状。
g = np.linspace(1,10,5) # 定义段长 和arange相似,但是第三个参数指定的是
# 多少段,也就是多少个数,
print(g)
h = np.linspace(1,10,6).reshape((2,3)) # 可以更改形状
print(h)
结果:
[ 1. 3.25 5.5 7.75 10. ]
[[ 1. 2.8 4.6]
[ 6.4 8.2 10. ]]
3.基础运算
对于矩阵也有加、减、乘、除法运算。
矩阵之间的加减法和普通的运算一样,这里不再赘述。直接上代码。
加、减,单个数相乘法
a = np.array([10,20,30,40])
b = np.arange(4)
print(a,b)
c = a-b # array 加法
d = b**2 # 单个数乘法
print(c)
print(d)
结果:
[10 20 30 40] [0 1 2 3]
[10 19 28 37]
[0 1 4 9]
矩阵相乘
用.dot表示矩阵相乘
a = np.array([[1,1],
[0,1]])
b = b.reshape((2,2))
print(a)
print(b)
c= a*b # 逐个元素相乘
c_dot = np.dot(a,b) # 矩阵运算
c_dot_2 = a.dot(b) # 同上
print(c)
print(c_dot)
结果;
[[1 1]
[0 1]]
[[0 1]
[2 3]]
[[0 1]
[0 3]]
[[2 4]
[2 3]]
numpy还自带sin、cos、tan等函数
e = 10*np.sin(a) # np自带sin,cos,tan函数
print(e)
结果:
[-5.44021111 9.12945251 -9.88031624 7.4511316 ]
axis、sum、min、max
axis=0时,进行列操作,当axis=1时,进行行操作。
f = np.random.random((2,4))
print(f)
print(np.sum(f,axis=0)) # 当axis = 0时,进行列操作
# 当axis = 1时,进行行操作
print(np.min(f,axis=1))
print(np.max(f))
结果:
[[0.59017978 0.81785528 0.1870801 0.32297439]
[0.88120557 0.15484577 0.45264645 0.54394487]]
[1.47138535 0.97270106 0.63972654 0.86691925]
[0.1870801 0.15484577]
0.8812055728408469
接了下来用一串代码描述以下内容:
属性 | 说明 |
---|---|
np.argmin (A) | 最小值的索引 |
np.argmax (A) | 最大值的索引 |
np.mean(A) | 平均值(还可以写成A.mean()) |
npaverage(A) | 平均值 |
np.median(A) | 中位数 |
np.cumsum(A) | 累加 |
np.diff(A) | 逐差 |
np.nonzero(A) | 非零的数,输出行数和列数 |
np.sort(A) | 逐行排序 |
np.transpose(A) | 转置 |
A.T | 转置 |
np.clip(A,5,9) | 滤波,所有大于9的数变成0所有小于5的数变成5 |
np.mean(A,axis=0) | 每一列求平均值 |
代码详情:
import numpy as np
A = np.arange(2,14).reshape((3,4))
print(np.argmin(A)) # 最小值的索引
print(A)
print(np.argmax(A)) # 最大值索引
print(np.mean(A)) # 平均值
print(A.mean())
print(np.average(A)) # 平均值
print(np.median(A)) #中位数
print(np.cumsum(A)) # 累加
print(np.diff(A)) # 逐差
print(np.nonzero(A)) # 非零的数 输出行数和列数
print(np.sort(A)) # 逐行排序
print(np.transpose(A)) # 转置
print(A.T) # 转置
print((A.T).dot(A))
print(np.clip(A,5,9)) #所有大于9的数变成9所有小于5的数变成5
print(np.mean(A,axis=0))
结果:
0
[[ 2 3 4 5]
[ 6 7 8 9]
[10 11 12 13]]
11
7.5
7.5
7.5
7.5
[ 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=int64), array([0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3], dtype=int64))
[[ 2 3 4 5]
[ 6 7 8 9]
[10 11 12 13]]
[[ 2 6 10]
[ 3 7 11]
[ 4 8 12]
[ 5 9 13]]
[[ 2 6 10]
[ 3 7 11]
[ 4 8 12]
[ 5 9 13]]
[[140 158 176 194]
[158 179 200 221]
[176 200 224 248]
[194 221 248 275]]
[[5 5 5 5]
[6 7 8 9]
[9 9 9 9]]
[6. 7. 8. 9.]
4.索引
array索引从0开始
利用切片形式进行索引
flatten()方法降维,使得所有数据排成一个列表。
A.flat也是降维,但必须用一个迭代器才能输出所有值
代码;
import numpy as np
A = np.arange(3,15).reshape((3,4))
print(A)
print(A[2][1]) # 索引 从0开始
print(A[2,1])
print(A[:,1])
print(A[1,1:3]) # 类似于切片
for row in A: # 迭代每一行
print(row)
for column in A.T: # 迭代每一列
print(column)
print(A.flatten()) # 降维一行
for item in A.flat:
print(item)
结果;
[[ 3 4 5 6]
[ 7 8 9 10]
[11 12 13 14]]
12
12
[ 4 8 12]
[8 9]
[3 4 5 6]
[ 7 8 9 10]
[11 12 13 14]
[ 3 7 11]
[ 4 8 12]
[ 5 9 13]
[ 6 10 14]
[ 3 4 5 6 7 8 9 10 11 12 13 14]
3
4
5
6
7
8
9
10
11
12
13
14
6.array合并
主要有三个方法 垂直叠加,水平叠加,concatenate
垂直相加
import numpy as np
A = np.array([1,1,1])
B = np.array([2,2,2])
C =np.vstack((A,B))
print(np.vstack((A,B))) # vertical stack 垂直叠加
print(A.shape,C.shape)
结果;
[[1 1 1]
[2 2 2]]
(3,) (2, 3)
水平叠加
D = np.hstack((A,B)) # horizontal stack 水平叠加
print(D)
print(A.shape,D.shape)
结果:
[1 1 1 2 2 2]
(3,) (6,)
np.newaxis 加一个维度
np.concatenate(_,axis=) 进行行合并或者列合并由axis控制 0代表垂直相加,1代表水平相加
代码:
A = np.array([1,1,1])[:,np.newaxis] # 给列方向加一个维度 变成(3,1)
B = np.array([2,2,2])[:,np.newaxis]
print(np.hstack((A,B)))
C = np.concatenate((A,B,B,A),axis=1) #横向合并 和hstack和vstack相似
print(C)
结果:
[[1 2]
[1 2]
[1 2]]
[[1 2 2 1]
[1 2 2 1]
[1 2 2 1]]
7.array分割
split切块的应用,axis=1时,垂直分割成块,axis=0时,水平分割成块。
array_split()不能够等分的时候用这个
vsplit():垂直分割
hsplit():水平分割
应用看代码;
import numpy as np
A = np.arange(12).reshape((3,4))
print(A)
print(np.split(A,2,axis=1)) # 将A垂直分割成两块
print(np.split(A,3,axis=0)) # 将A水平分割成两块
print(np.split(A,[1,3],axis=1)) # 分成1 2 1 中间列表[1,3] 可以解释为索引小于1为第一块,1到
# 3之间为第二块 大于3为第三块
print(np.split(A,[1,2,3],axis=1)) # 分成 1 1 1 1
print(np.array_split(A,3,axis=1)) # 不等分
print(np.vsplit(A,3)) # 垂直分割
print(np.hsplit(A,2)) # 水平分割
结果;
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[array([[0, 1],
[4, 5],
[8, 9]]), array([[ 2, 3],
[ 6, 7],
[10, 11]])]
[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]])]
[array([[0],
[4],
[8]]), array([[ 1, 2],
[ 5, 6],
[ 9, 10]]), array([[ 3],
[ 7],
[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],
[ 6],
[10]]), array([[ 3],
[ 7],
[11]])]
[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]])]
[array([[0, 1],
[4, 5],
[8, 9]]), array([[ 2, 3],
[ 6, 7],
[10, 11]])]
8.numpy的复制
copy的应用。
由于建立一个数组或者矩阵后,a = np.arange(4),令b = a ,c = a,d = b 这时候改变a,b,c,d任何一个,其他三个都会变化,这是因为,内存中只有一个 np.arange(4),a,b,c,d是物理内容的索引,更改一个之后,也就是更改了物理内容,那么其他索引指向的内容也会变化。
若不想其他三个变化,则要使用copy()这个方法,将重新开辟内存存放物理内容。
import numpy as np
a = np.arange(4)
b = a
c = a
d = b
a[0] = 11
print('a',a) # 浅度copy
print('b',b)
print('c',c)
print('d',d)
d[1:3] = [22,33]
print('a',a)
print('b',b)
print('c',c)
print('d',d)
b= a.copy()
a[3] =44
print('a',a)
print('b',b)
结果;
a [11 1 2 3]
b [11 1 2 3]
c [11 1 2 3]
d [11 1 2 3]
#更改d的内容后:
a [11 22 33 3]
b [11 22 33 3]
c [11 22 33 3]
d [11 22 33 3]
#copy方法的应用,更改a的值后a,b的对比
a [11 22 33 44]
b [11 22 33 3]
(未完待续,日后学习后继续补充)