NumPy系统是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list structure)结构要高效的多(该结构也可以用来表示矩阵(matrix))。numpy内置了并行运算功能,当系统有多个核心时,做某种计算时,numpy会自动做并行计算。Numpy底层使用C语言编写,数组中直接存储对象,而不是存储对象指针,所以其运算效率远高于纯Python代码。
本文将numpy常用的基本功能以最简单的Demo展示出来,学习编程理论很重要,但亲自去一点点的敲出代码更重要,如果能够理解下面这些例子,那么numpy应该用着很顺手了。
一、numpy属性
二、array创建
三、numpy矩阵运算1
四、numpy随机数生成以及矩阵运算2
五、numpy的索引
六、array合并
七、array分割
八、numpy的浅拷贝和深拷贝
一、numpy属性
import numpy as np
array = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]) # 最外面两侧[]是二维矩阵,同理最外面三层[]是三维矩阵;最外面一层[]是一维矩阵(即向量)
print(array)
print(array.ndim) # 矩阵维度
print(array.shape) # 矩阵形状(行列数)
print(array.size) # 矩阵大小(元素个数)
print(array.dtype) # 元素类型
二、array创建
import numpy as np
a = np.array([1, 2, 3], dtype=np.int32) # 创建元素数据类型(dtype-data type)为整形的一维矩阵
print(a.dtype)
b = np.array([1, 2, 3], dtype=np.float) # 创建元素数据类型(dtype-data type)为浮点型的一维矩阵
print(b.dtype)
c = np.array([1, 2, 3]) # 创建一维数据
print(c)
d = np.array([[1, 2, 3], [4, 5, 6]]) # 创建二维矩阵
print(d)
zero = np.zeros((2, 3)) # 生成2行3列元素全为0的矩阵
print(zero)
one = np.ones((3, 4)) # 生成3行4列元素全为1的矩阵
print(one)
empty = np.empty((2, 3)) # 生成2行3列元素全部接近于0(但不等于0)的矩阵
print(empty)
e = np.arange(10) # 生成从0到9的一维数据
print(e)
f = np.arange(3, 10) # 生成从3到9的一维数据
print(f)
g = np.arange(3, 10, 3) # 生成从3到9间隔为3的一维数据
print(g)
h = np.reshape(e, (2, 5)) # 改变矩阵的形状
print(h)
i = np.arange(8).reshape(4, 2) # 改变矩阵形状
print(i)
三、numpy矩阵运算1
import numpy as np
arr1 = np.array([[1, 2, 3],
[4, 5, 6]])
arr2 = np.array([[1, 1, 2],
[2, 3, 3]])
print(arr1)
print(arr2)
print(arr1 + arr2) # 矩阵加法运算 (按位相加)
print(arr1 - arr2) # 矩阵减法运算 (按位相减)
print(arr1 * arr2) # 矩阵乘法运算 (按位相乘)
print(arr1 ** arr2) # 矩阵幂运算 (arr1元素为底数,对应的arr2元素为幂)
print(arr1 / arr2) # 矩阵除法运算 (按位相除)
print(arr1 % arr2) # 矩阵取余运算 (按位取余)
print(arr1 // arr2) # 矩阵取整运算 (按位取整)
print(arr1 + 2) # 所有的元素加2
print(arr1 * 10) # 所有的元素乘10
arr3 = arr1 > 3 # 元素大小判断
print(arr3)
print(arr1)
arr4 = np.ones((3, 5))
print(arr4)
print(np.dot(arr1, arr4)) # 矩阵乘法(矩阵运算法则)
print(arr1.dot(arr4)) # 矩阵乘法(矩阵运算法则)
print(arr1)
print(arr1.T) # 矩阵转置
print(np.transpose(arr1)) # 矩阵转置
四、numpy随机数生成以及矩阵运算2
import numpy as np
sample1 = np.random.random((3, 2)) # 生成3行2列从0到1的随机数
print(sample1)
sample2 = np.random.normal(size=(3, 2)) # 生成3行2列符合标准正态分布的随机数
print(sample2)
sample3 = np.random.randint(0, 10, size=(3, 2)) # 生成3行2列从0到10的随机整数
print(sample3)
print(np.sum(sample1)) # 求和(将矩阵中所有元素相加 )
print(np.min(sample1)) # 求最小值(获取矩阵中所有元素最小值 )
print(np.max(sample1)) # 求最大值(获取矩阵中所有元素最大值 )
print(sample1)
print(np.sum(sample1, axis=0)) # 对列求和
print(np.sum(sample1, axis=1)) # 对行求和
print(np.argmin(sample1)) # 求矩阵中元素最小值的索引
print(np.argmax(sample1)) # 求矩阵中元素最大值的索引
print(np.mean(sample1)) # 求矩阵中元素的平均值
print(sample1.mean()) # 求矩阵中元素的平均值
print(np.median(sample1)) # 求矩阵元素的中位数
print(sample1)
print(np.sqrt(sample1)) # 求矩阵元素的开方
sample4 = np.random.randint(0, 10, size=(1, 10))
print(sample4)
print(np.sort(sample4)) # 排序(从小到大)
print(np.sort(sample1)) # 对每行元素从小到大排序
print(np.clip(sample4, 2, 8)) # 将矩阵中元素小于2的全部变为2,大于8的全部变为8,其它不变
五、numpy的索引
import numpy as np
arr1 = np.arange(2, 14)
print(arr1)
print(arr1[2]) # 提取第2个位置(位置从0开始计)的数据
print(arr1[1:4]) # 提取从第1到第4个位置(不包括第4个位置)数据
print(arr1[1:-1]) # 提取从第1个位置到倒数第1个位置(不包括倒数第一个位置)的数据
print(arr1[:5]) # 提取前5个数据
print(arr1[-2:]) # 提取后2个数据
arr2 = arr1.reshape((3, 4))
print(arr2)
print(arr2[1]) # 提取矩阵(二维数组)中第1行(从0开始计)的数据
print(arr2[1][1]) # 提取矩阵(二维数组)中第1行第1列(从0开始计)的数据
print(arr2[1, 1]) # 提取矩阵(二维数组)中第1行第1列(从0开始计)的数据
print(arr2[:, 2]) # 提取所有行中的第2列数据
for i in arr2: # 迭代行
print(i)
for i in arr2.T: # 迭代列
print(i)
for i in arr2.flat: # 迭代每个元素
print(i)
六、array合并
import numpy as np
arr1 = np.array([1, 2, 3])
print(arr1)
arr2 = np.array([4, 5, 6])
print(arr2)
arr3 = np.vstack((arr1, arr2)) # 垂直合并矩阵
print(arr3)
print(arr3.shape)
arr4 = np.hstack((arr1, arr2)) # 水平合并
print(arr4)
print(arr4.shape)
print(np.concatenate((arr1, arr2))) # 合并数据
print(arr3)
arr5 = np.concatenate((arr3, arr3), axis=0) # 垂直合并(合并矩阵的形状要相似)
print(arr5)
arr5 = np.concatenate((arr3, arr3), axis=1) # 水平合并
print(arr5)
print(arr1.T) # 测试发现一维数据不能转置
print(arr1.shape)
arr1_1 = arr1[np.newaxis, :] # 在行的位置给一维数据添加一个维度,使其转为二维数据
print(arr1_1)
print(arr1_1.shape)
print(arr1_1.T) # 此时可以转置了
arr1_2 = arr1[:, np.newaxis] # 在列的位置给一维数据添加一个维度,使其转为二维数据
print(arr1_2)
print(arr1_2.shape)
arr1_3 = np.atleast_2d(arr1) # 如果arr1的维度小于2维,则将其转为2维数据
print(arr1_3)
print(arr1_3.T)
七、array分割
import numpy as np
arr1 = np.arange(12).reshape((3, 4))
print(arr1)
arr2, arr3 = np.split(arr1, 2, axis=1) # 水平方向分割,分为2份
print(arr2)
print(arr3)
arr4, arr5, arr6 = np.split(arr1, 3, axis=0) # 垂直方向分割,分为3份
print(arr4)
print(arr5)
print(arr6)
arr4, arr5, arr6 = np.array_split(arr1, 3, axis=1) # 水平方向分割,分为3份,不等分割
print(arr4)
print(arr5)
print(arr6)
arr4, arr5, arr6 = np.vsplit(arr1, 3) # 垂直方向分割,分为3份
print(arr4)
print(arr5)
print(arr6)
arr4, arr5 = np.hsplit(arr1, 2) # 水平方向分割,分为2份
print(arr4)
print(arr5)
八、numpy的浅拷贝和深拷贝
import numpy as np
arr1 = np.array([1, 2, 3])
arr2 = arr1 # 浅拷贝(arr2与arr1共享一块内存,arr2和arr1的改变相互影响)
arr2[0] = 6
print(arr1)
print(arr2)
arr3 = arr1.copy() # 深拷贝(arr2与arr1各自拥有独立的内存,arr2和arr1的改变没有直接联系)
arr3[0] = 8
print(arr1)
print(arr3)