文章目录:
10.1 Numpy基础
1)NumPy的主要对象是相同元素的多维数组。它的元素类型是相同的。在NumPy中,维数(dimensions)也称为轴(axes)。
2)例如,3D空间中的点的坐标[1, 2, 1]只有一个轴。该轴上有3个元素,所以我们说它的长度为3。在下图所示的示例中,数组有2个轴。第一轴的长度为2,第二轴的长度为3。也就是几维数组就有几个轴。
[[ 1., 0., 0.],
[ 0., 1., 2.]]
3)NumPy的数组类称为ndarray,也叫array。但是,numpy.array与标准Python库类的array.array是不同的,后者仅处理一维数组且功能较少。numpy可以完成高效的矩阵运算。
10.2 Numpy中array的属性
1)numpy中的array有一些常见的属性:维数(ndim)、形状(shape)、大小(size)、数据类型(dtype)、元素字节数(itemsize)等,用法如下:
import numpy as np
#创建一个二维array
array = np.array([[1,2,3],
[2,3,4]])
#打印属性
print(array)
print(array.ndim)
print(array.shape)
print(array.size)
print(array.dtype)
print(array.itemsize)
输出:
[[1 2 3]
[2 3 4]]
2
(2, 3)
6
int32
4
10.3 Numpy中array的创建
1)通常情况下我们使用list或者tuple来初始化array:
import numpy as np
#创建一个一维数组 数据类型为int
array1 = np.array( [1,2,3], dtype = int )
#创建一个二维array 数据类型为float
array2 = np.array( ( (1,2,3), (2,3,4) ) ,dtype = float)
#创建一个三维数组
array3 = np.array( [[(1.3,2,3),(2,3.4,4)],[(1,2,3),(2,3,4)]] ,dtype = float)
#打印属性
print(array1)
print(array2)
print(array3)
print(array3.ndim)
print(array3.shape)
输出:
[1 2 3]
[[1. 2. 3.]
[2. 3. 4.]]
[[[1.3 2. 3. ]
[2. 3.4 4. ]]
[[1. 2. 3. ]
[2. 3. 4. ]]]
3
(2, 2, 3)
2)也可以创建一些特殊的array:
import numpy as np
#创建一个三行四列所有元素都是0的数组 默认为float类型
array1 = np.zeros((3,4))
#创建一个2*3*4的数组 数据类型为int
array2 = np.ones( (2,3,4),dtype = int)
#创建一个从10到25(不包含25) 每隔5个创建一个
array3 = np.arange(10, 25 ,5, dtype = float)
#从0到2 四个数平均的一维数组
array4 = np.linspace(0,2,4)
#创建一个3*3的单位矩阵
array5 = np.eye(3)
# 创建一个2*2的随机矩阵
array6 = np.random.random((2,2))
# 创建一个2*2空矩阵 里面的元素随机
array7 = np.empty((2,2))
# 创建一个所有元素都为7的2*2矩阵
array8 = np.full((2,2) , 7)
#打印属性
print(array1)
print(array2)
print(array3)
print(array4)
print(array5)
print(array6)
print(array7)
print(array8)
运行结果:
[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]
[[[1 1 1 1]
[1 1 1 1]
[1 1 1 1]]
[[1 1 1 1]
[1 1 1 1]
[1 1 1 1]]]
[10. 15. 20.]
[0. 0.66666667 1.33333333 2. ]
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
[[0.57967404 0.76892429]
[0.58360366 0.10839214]]
[[6.23037657e-307 8.90104239e-307]
[3.56050863e-307 1.60219035e-306]]
[[7 7]
[7 7]]
10.4 Numpy中array的基础运算
1)值得注意的是numpy中array的运算都是对应元素计算,对于乘法需要使用dot()函数来使用矩阵运算。
import numpy as np
a = np.array([[1,2],[3,4]])
b = np.array([[2,3],[4,5]])
print(a)
print(b)
print(a + b)
print(a - b)
# 对应元素相乘两种方式
print(a * b)
print(np.multiply(a,b))
# 矩阵乘法
print(a.dot(b))
# 对应元素相除两种方式
print(a / b)
print(np.divide(a,b))
# 一些数学运算
print(np.exp(a))
print(np.sqrt(a))
print(np.sin(a))
print(np.cos(a))
print(np.log(a))
#比较运算 每个元素对应输出false或true
print( a < 2 )
print( a == b)
输出:
[[1 2]
[3 4]]
[[2 3]
[4 5]]
[[3 5]
[7 9]]
[[-1 -1]
[-1 -1]]
[[ 2 6]
[12 20]]
[[ 2 6]
[12 20]]
[[10 13]
[22 29]]
[[0.5 0.66666667]
[0.75 0.8 ]]
[[0.5 0.66666667]
[0.75 0.8 ]]
[[ 2.71828183 7.3890561 ]
[20.08553692 54.59815003]]
[[1. 1.41421356]
[1.73205081 2. ]]
[[ 0.84147098 0.90929743]
[ 0.14112001 -0.7568025 ]]
[[ 0.54030231 -0.41614684]
[-0.9899925 -0.65364362]]
[[0. 0.69314718]
[1.09861229 1.38629436]]
[[ True False]
[False False]]
[[False False]
[False False]]
2)一些统计运算:可以加上axis信息axis=0表示沿着竖直统计,axis=1表示水平行统计:
import numpy as np
a = np.array([[1,2],[3,4]])
print(a)
# 平均数
print(np.average(a))
print(np.average(a,axis=0))
# 中位数
print(np.median(a))
print(np.median(a, axis= 0))
# 最大值
print(np.max(a))
print(np.max(a,axis=1))
# 均值
print(np.mean(a,axis=1))
# 标准差
print(np.std(a,axis=1))
# 方差
print(np.var(a,axis=1))
输出:
[[1 2]
[3 4]]
2.5
[2. 3.]
[1.5 3.5]
2.5
[2. 3.]
4
[2 4]
[1.5 3.5]
[0.5 0.5]
[0.25 0.25]
3)向量的叉乘:
import numpy as np
a = np.array([1,0,0])
b = np.array([0,1,0])
c = np.cross(a,b)
print(a)
print(b)
print(c)
输出:
[1 0 0]
[0 1 0]
[0 0 1]
10.5 Numpy中元素访问
1)对于一维array来说,访问方式和list相同:
import numpy as np
a = np.array([1,2,3,4])
print(a)
print(a[0])
print(a[1])
print(a[0:2])
print(a[0:])
print(a[:3])
输出:
[1 2 3 4]
1
2
[1 2]
[1 2 3 4]
[1 2 3]
2)对于二维及以上array访问方式如下:
import numpy as np
# 二维矩阵
a = np.arange(12).reshape(3, 4)
print(a)
# 返回的是list
print(a[0]) #访问第0行
print(a[1]) #访问第1行
print(a[1,2]) #访问第1行第二列元素6
print(a[1:,2]) #访问第一行到最后一行所有第二列的元素6和10
print(a[ a < 6]) #a中小于6的元素的list
# 如果两个维度都用冒号,返回的是numpy.array类型
print(a[1:2,:2]) #访问第一行第0列到第二列的元素
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[0 1 2 3]
[4 5 6 7]
6
[ 6 10]
[0 1 2 3 4 5]
[[4 5]]
3)一维array和二维array的遍历:
import numpy as np
a = np.array([1,2,3,4])
# 一维array的遍历
for i in a:
print(i)
# 二维array
b = np.arange(12).reshape(3,4)
# 按行访问
for i in b:
print(i)
# 按列访问
for i in b.T:
print(i)
print(b.flatten()) # 返回一个list 和b.ravel()一样
#print(b.flat) # 返回一个generator
# 逐个遍历所有元素
for i in b.flat:
print(i)
1
2
3
4
[0 1 2 3]
[4 5 6 7]
[ 8 9 10 11]
[0 4 8]
[1 5 9]
[ 2 6 10]
[ 3 7 11]
[ 0 1 2 3 4 5 6 7 8 9 10 11]
0
1
2
3
4
5
6
7
8
9
10
11
10.6 Numpy中array的合并
import numpy as np
a = np.array(([1,2,3,4],[5,6,7,8]))
b = np.array(([5,6,7,8],[9,10,11,12]))
# 垂直方向合并
print(np.vstack((a,b)))
# 水平方向合并
print(np.hstack((a,b)))
# 另外一种方式
print(np.concatenate((a,b,a),axis = 0 ))
[[ 1 2 3 4]
[ 5 6 7 8]
[ 5 6 7 8]
[ 9 10 11 12]]
[[ 1 2 3 4 5 6 7 8]
[ 5 6 7 8 9 10 11 12]]
[[ 1 2 3 4]
[ 5 6 7 8]
[ 5 6 7 8]
[ 9 10 11 12]
[ 1 2 3 4]
[ 5 6 7 8]]
10.7 Numpy中array的分割
import numpy as np
a = np.arange(12).reshape((3,4))
print(a)
# 在水平方向上分成三块
print(np.split(a,3,0))
#print(np.vsplit(a,3))
# 在垂直方向上分成2块
print(np.split(a,2,1))
#print(np.hsplit(a,2))
# 不等量的分割
print(np.array_split(a,3,1))
[[ 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],
[4, 5],
[8, 9]]), array([[ 2, 3],
[ 6, 7],
[10, 11]])]
[array([[0, 1],
[4, 5],
[8, 9]]), array([[ 2],
[ 6],
[10]]), array([[ 3],
[ 7],
[11]])]
10.8 Numpy中深拷贝和浅拷贝
import numpy as np
a = np.arange(4)
# numpy中直接等于号赋值是浅拷贝
b = a
c = a
a[0] = 6
print(a)
print(c)
print(b is a)
# 深拷贝用copy()
d = a.copy()
print(d is a)
a[0] = 3
print(d)
[6 1 2 3]
[6 1 2 3]
True
False
[6 1 2 3]
10.9 Numpy中的排序
import numpy as np
a = np.array(([3,2,4],[3,5,1]))
# sort方法默认沿着axis=0的方向从小到大排序
print(a)
a.sort(axis=0)
print(a)
a.sort(axis=1)
print(a)
[[3 2 4]
[3 5 1]]
[[3 2 1]
[3 5 4]]
[[1 2 3]
[3 4 5]]