java中的接口是类吗
326
2022-08-28
【Python学习日志】 - Numpy包
NumPy是什么?
使用Python进行科学计算的基础包,在数据分析的时候比较常用到矩阵计算。这时太多的Np属性不记得,所以方便自己使用把一些常用的Np属性汇总记录一下使用的时候方便查找。
ndarray.ndim 阵列的轴数(尺寸)。 ndarray.shape 数组的大小。这是一个整数元组,表示每个维度中数组的大小。对于具有n行和m列的矩阵,shape将是(n,m)。shape因此,元组的长度 是轴的数量ndim。 ndarray.size 数组的元素总数。这相当于元素的乘积shape。 ndarray.dtype 描述数组中元素类型的对象。可以使用标准Python类型创建或指定dtype。此外,NumPy还提供自己的类型。numpy.int32,numpy.int16和numpy.float64就是一些例子。 ndarray.itemsize 数组中每个元素的大小(以字节为单位)。例如,类型的元素数组float64有itemsize8(= 64/8),而其中一个类型complex32有itemsize4(= 32/8)。它相当于ndarray.dtype.itemsize。 ndarray.data 包含数组实际元素的缓冲区。通常,我们不需要使用此属性,因为我们将使用索引工具访问数组中的元素
杂乱的知识?
查看一个函数的帮助文档,可以直接在文件里输入代码: help(np.add)
或者在命令行中输入:np.info(np.add)
查看包的版本号信息,可以直接输出: np.__version__
用zero函数创建数组,默认单元大小是八个字节(也就是默认double?)
import numpy as npA = np.zeros(4)print(A.itemsize)print(A.itemsize*A.size)输出:832
注意数组起始下标是从0开始的。
关于arange和reshape函数:
import numpy as npA = np.arange(8).reshape(2,4)print(A)输出:[[0 1 2 3] [4 5 6 7]]
关于返回非零元素的下标的一系列骚操作:
import numpy as npA = np.arange(8).reshape(2,4)A=A+1A[0][1]=0print(A)print(np.nonzero(A))输出:[[1 0 3 4] [5 6 7 8]](array([0, 0, 0, 1, 1, 1, 1], dtype=int64), array([0, 2, 3, 0, 1, 2, 3], dtype=int64))
其中返回的两个参数,一个是第一维的下标,一个是第二维的下标。
关于eye函数,random函数,以及变量性质的测试
B = np.eye(2)print(B)print(B.size)print(B[0][1])B=np.random.random((3,2))print(B)B="hello"print(B)输出:[[1. 0.] [0. 1.]]40.0[[0.29490288 0.14067274] [0.96161076 0.92929841] [0.26694438 0.40938209]]hello
由此可见,相同都变量名是可以在不同时刻代替不同东西的。
但是不能对这个变量的其中一部分进行代替操作:(下面的函数中,只运行前两行是没有问题的)
程序1:qqweqeqweqq = np.zeros(12)for i in range(10): qqweqeqweqq[i]=np.zeros(12)Error:ValueError: setting an array element with a sequence.----------------------------------------------------------------------------------程序2:qqweqeqweqq = np.zeros((10,2))for i in range(10): qqweqeqweqq[i]=np.zeros(12)Error:ValueError: could not broadcast input array from shape (12) into shape (2)
但是这样是没有问题的:
qqweqeqweqq = np.zeros((10,2))qqweqeqweqq = np.zeros(12)
疑问:sequence,array,list,dic,都有啥区别?
sum函数,max函数,min函数,mean函数
B=np.random.random((3,2))print(B)print(B.max(),B.min(),B.mean())输出:[[0.89882712 0.77860196] [0.7093924 0.15120126] [0.99924821 0.91765126]]0.9992482107724574 0.15120126168466463 0.7424870345505307
对应的,可以添加参数axis=0代表在第0维上进行合并
进一步体验random函数
np1.random.rand(0-1之间的的随机数生成)\randn(服从正态分布的随机数生成)\randint(随机整数的生成)\choice([])(随机数产生的范围自定义)\......(其他随机数类型),举例如下:(图片源自链接)
体验索引下标区别:
B=np.arange(25).reshape((5,5))print(B)print(B[1:-1,1:-1])print(B[1:-1])print(B[1:-1][1:-1])输出:[[ 0 1 2 3 4] [ 5 6 7 8 9] [10 11 12 13 14] [15 16 17 18 19] [20 21 22 23 24]][[ 6 7 8] [11 12 13] [16 17 18]][[ 5 6 7 8 9] [10 11 12 13 14] [15 16 17 18 19]]
int,float,str之间的类型转换:
num2 = "123"; num2 = int(num1); print("num2: %d" % num2); ''' 输出 num2: 123 ''' num1 = "123.12"; num2 = float(num1); print("num2: %f" % num2); ''' num2: 123.120000 ''' num = 123; mystr = str(num); print ("%s" % mystr); ''' 输出 123 '''
其他小测试:(关于numpy的sum函数)
range(2,4)Out[141]: range(2, 4)np.sum(range(4))Out[142]: 6qqqq=range(4)qqqqOut[144]: range(0, 4)type(qqqq)Out[145]: rangenp.sum(range(10,12))Out[146]: 21
numpy包中,还有一个非常实用的玩意:矩阵操作。
创建一个矩阵,可以使用函数np,mat(...),参数可以是一个list或者是一个narray。
你想构建一个2*3的全1矩阵,则只需要:
A=np.mat(np.ones(6).reshape(2,3))
即可。
现在假设A是个矩阵,那么:
求矩阵的逆:A.I 或者:np.linalg.inv(A)
求矩阵的转置:A.T 或者: A.linalg.transpose()
求矩阵的行列式:np.linalg.det(A)
求矩阵的特征值和特征向量:np.linalg.eig(np1)
矩阵的点乘:np.linalg.dot(A,B)
求线性方程组的解: 首先写出方程组的右边的y值向量:y=np.array([[y1],[y2],[y3]...]) 函数值的集合等于 x=np.linalg.solve(A,y)
但是要注意np.mat()和np.matrix()的区别:后者是完全复制,前者是当参数是矩阵的时候是直接引用的。
关于数据保存
Numpy提供了几种数据保存的方法。
以3*4数组a为例:
1. a.tofile("filename.bin")
这种方法只能保存为二进制文件,且不能保存当前数据的行列信息,文件后缀不一定非要是bin,也可以为txt,但不影响保存格式,都是二进制。
这种保存方法对数据读取有要求,需要手动指定读出来的数据的的dtype,如果指定的格式与保存时的不一致,则读出来的就是错误的数据。
b = numpy.fromfile("filename.bin",dtype = **)
读出来的数据是一维数组,需要利用
b.shape = 3,4重新指定维数。
2.numpy.save("filename.npy",a)
利用这种方法,保存文件的后缀名字一定会被置为.npy,这种格式最好只用
numpy.load("filename")来读取。
3.numpy.savetxt("filename.txt",a)
b = numpy.loadtxt("filename.txt")
用于处理一维和二维数组
两个数组的拼接:
np.concatenate((list1,list2),axis=0):矩阵之间的拼接
axis=0,代表在行方向上拼接(竖着接到后面)
axis=1,代表在列方向上拼接(横着接到后面)
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~