python:NumPy基础入门

it2025-10-07  1

文章参考 https://zhuanlan.zhihu.com/p/32242331,例子都是一个一个敲得,python3 莫得问题嘞呀

文章目录

一、window 安装二、创建NumPy Ndarray 对象参数说明: 三、矩阵合并纵向合并 vstack横向合并 hstackconcatenate 也可以矩阵合并 四、矩阵按条件截取五、矩阵行列六、函数生成矩阵arange 和 range() 函数类似linspace 等差数列logspace 等比数列ones、zeros、eye、emptyfromstring 将字符串转换矩阵random 随机数生成数组fromfunction 根据矩阵行号列号生成矩阵 七、矩阵的运算矩阵常规运算矩阵点乘矩阵的转置 a.T逆矩阵矩阵信息获取最值平均值方差标准差中值(中位数)求和累积和极差 八、NumPy IOload() 和 save()savez()loadtxt() 和 savetxt()

一、window 安装

pip install numpy

切换清华下载源 ,scipy 以及matplotlib 可结合 numpy 实现更多计算以及绘图

pip3 install numpy scipy matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple

测试安装

>>> from numpy import * >>> eye(4) array([[1., 0., 0., 0.], [0., 1., 0., 0.], [0., 0., 1., 0.], [0., 0., 0., 1.]])

二、创建NumPy Ndarray 对象

array() 函数创建 Ndarray 对象

numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)

参数说明:

名称 描述

object 数组或嵌套的数列dtype 数组元素的数据类型,可选copy 对象是否需要复制,可选order 创建数组的样式,C为行方向,F为列方向,A为任意方向(默认)subok 默认返回一个与基类类型一致的数组ndmin 指定生成数组的最小维度 np.array([1, 2, 3, 4], ndmin=3) = [[[1 2 3 4]]]

三、矩阵合并

纵向合并 vstack

np.vstack((a,b)) 将 a, b 矩阵由原来两行两列,合并为四行两列

横向合并 hstack

np.hstack((a,b)) 将 a, b 矩阵由原来两行两列,合并为两行四列

concatenate 也可以矩阵合并

np.concatenate( (a1,a2), axis=0 ) 等价于 np.vstack( (a1,a2) ) np.concatenate( (a1,a2), axis=1 ) 等价于 np.hstack( (a1,a2) )

四、矩阵按条件截取

b = a[a>6] 返回结果为一维数组 a[a>6] = 0 将原矩阵中所有 大于6 的元素赋值为0

五、矩阵行列

a.shape 返回结果为含两个元素的元组 如:(2,5)及 2 行 5 列

六、函数生成矩阵

arange 和 range() 函数类似

a = np.arange(10) # 默认从0开始到10(不包括10),步长为1 返回 [0 1 2 3 4 5 6 7 8 9]

a2 = np.arange(5,20,2) # 从5开始到20(不包括20),步长为2,返回 [ 5 7 9 11 13 15 17 19]

linspace 等差数列

a = np.linspace(0,20,5) # 生成首位是0,末位是20,含5个数的等差数列 返回 [ 0. 5. 10. 15. 20.]

logspace 等比数列

logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None, axis=0):

num为数列个数默认50,base 为指数底数 默认10 及为公比

返回结果为 [ 1. 2. 4. 8. 16. 32.] 从 1 开始,2^5 结束,以公比为 2 开始递增, 总共 6 个数= a = np.logspace(start=0, stop=5, num=6, base=2)

a = np.logspace(start=0, stop=0, num=6, base=5) # 返回结果为 [1, 1, 1, 1, 1, 1]

ones、zeros、eye、empty

ones创建全1矩阵 ,zeros创建全0矩阵 ,eye创建单位矩阵 ,empty创建空矩阵(实际有值)

a_empty = np.empty((2, 2)) # 创建2*2的空矩阵 返回[[0.33930547, 0.75305503],[0.77334359, 0.12428655]]

fromstring 将字符串转换矩阵

np.fromstring(‘abcdefg’, dtype=np.int8) # 返回结果为 [ 97 98 99 100 101 102 103]

random 随机数生成数组

np.floor(10*np.random.random((2, 5))) # 返回结果为 [[3., 6., 6., 6., 3.], [1., 5., 3., 3., 9.]]

fromfunction 根据矩阵行号列号生成矩阵

fromfunction(func,(5,6)) 第一个参数为 生成矩阵方法,第二个参数为矩阵大小

def func(i,j): return i+j a = np.fromfunction(func,(5,6)) # 返回 [[ 0. 1. 2. 3. 4. 5.] [ 1. 2. 3. 4. 5. 6.] [ 2. 3. 4. 5. 6. 7.] [ 3. 4. 5. 6. 7. 8.] [ 4. 5. 6. 7. 8. 9.]]

七、矩阵的运算

矩阵常规运算

需满足第一个矩阵的 列数 等于第二个矩阵行数

a = np.array([[4, 5, 6], [1, 2, 3]]) b = np.array([[6, 5, 4], [3, 2, 1]]) print(a*b) """ [[24 25 24] [ 3 4 3]] """

矩阵点乘

a1 = np.array([[1,2,3],[4,5,6]]) # a1为2*3矩阵 a2 = np.array([[1,2],[3,4],[5,6]]) # a2为3*2矩阵 print(a1.dot(a2)) """ [[22 28] [49 64]] """

如下所示 矩阵乘和点乘是不同的,矩阵相乘适用于 行列相同的矩阵,对应位置相乘,而矩阵点乘适用于第一个矩阵的列数等于第二个矩阵的行数

注意: 矩阵乘积 设A为 m * p 的矩阵,B为 p* n 的矩阵,那么称 A * B 的矩阵C为矩阵A与B的乘积 哈达马积(Hadamard product) 设矩阵 A 和矩阵 B 都是 m*n 的矩阵,及行列相同,则称 A * B 的矩阵 C 为哈达马积 克罗内克积(Kronecker Product) 克罗内克积是两个任意大小的矩阵间的运算,符号记作⊗。克罗内克积也被称为直积或张量积

矩阵的转置 a.T

a = np.array([[1,2,3], [4,5,6]]) print(a.T) # print(a.transpose())也可以转置 """ [[1, 4], [2, 5], [3, 6]] """

逆矩阵

设A是一个n阶矩阵,若存在另一个n阶矩阵B,使得: AB=BA=E ,则称方阵A可逆,并称方阵B是A的逆矩阵

需要先导入numpy.linalg,用linalg的inv函数来求逆

import numpy.linalg a1 = np.array([[2, 4, 4], [4, 8, 6], [2, 8, 4]]) print(numpy.linalg .inv(a1)) """ 可能会报 numpy.linalg.LinAlgError: Singular matrix,奇异矩阵,代表当前矩阵无逆矩阵 [[ 0. 0.5 -0.5 ] [-0.25 0. 0.25] [ 0.5 -0.25 0. ]] """

矩阵信息获取

最值
a = np.array([[1,2,9],[4,5,0]]) print(a.max()) #获取整个矩阵的最大值 结果: 9 print(a.min()) #结果:0 print(a.max(axis=0)) # 获取每列最大值 [4,5,9] print(a.max(axis=1)) # 获取每行最大值 [9,5] # 要想获得最大最小值元素所在的位置,可以通过argmax函数来获得 print(a.argmax(axis=1)) # 结果为 [2 2]
平均值

mean() 函数,同样可以通过添加 axis 获取行列平均值 a.mean()、 a.mean(axis=0)、 a.mean(axis=1)

方差

var() 函数,同样可以添加 axis 获取行列方差 a.var()、 a.var(axis=0) 、 a.var(axis=1)

标准差

std()函数,同样可以添加 axis 获取行列标准差 a.std()、 a.std(axis=0)、 a.std(axis=1)

中值(中位数)

median(),同样可以添加 axis 获取行列中值 numpy.median(a)、 numpy.median(a, axis=1)、 numpy.median(a, axis=0):与其他写法不同

求和

sum()函数,同样可以添加 axis 获取行列和 a.sum()、 a.sum(axis=0)、 a.sum(axis=1)

累积和

cumsum()函数,同样可以添加 axis 获取行列累积和

a = np.array([[1,2,3],[4,5,6]]) print(a.cumsum()) # 对整个矩阵求累积和 # 结果 [ 1 3 6 10 15 21]
极差

ptp() 函数,同样可以添加 axis 获取行列极差 a.ptp()、 a.ptp(axis=0)、 a.ptp(axis=1)

八、NumPy IO

Numpy 可以读写磁盘上的文本数据或二进制数据。

NumPy 为 ndarray 对象引入了一个简单的文件格式:npy。

npy 文件用于存储重建 ndarray 所需的数据、图形、dtype 和其他信息。

常用的 IO 函数有:

load() 和 save()

load() 和 save() 函数是读写文件数组数据的两个主要函数,默认情况下,数组是以未压缩的原始二进制格式保存在扩展名为 .npy 的文件中。

np.save(file='outfile.npy', arr=[1, 2, 3, 4], allow_pickle=True, fix_imports=True) print(np.load('outfile.npy')) # 结果 """ [1 2 3 4] """

savez()

savez() 函数用于将多个数组写入文件,默认情况下,数组是以未压缩的原始二进制格式保存在扩展名为 .npz 的文件中。

np.savez(file='outfile.npz', arr_0=[1, 2, 3], arr_1=[4, 5, 6], allow_pickle=True, fix_imports=True) print(np.load('outfile.npz')['arr_0']) """ [1 2 3] """

loadtxt() 和 savetxt()

loadtxt() 和 savetxt() 函数处理正常的文本文件(.txt 等)

np.savetxt('out.txt',[1,2,3,4,5]) print(np.loadtxt('out.txt')) # 结果 """ [1 2 3 4 5] """
最新回复(0)