【语言学习-python】numpy学习笔记

由 联环己烷 发布

基本上参考这篇博客=_=->here

闲话:装numpy装了一亿年……疯狂报错最后莫名其妙解决了……

什么是numpy

numpy(Numerical Python)是python的一种对多维数组(矩阵)进行运算的库。

学线代学子的福音

创建ndarray

'''
ndarray:一种n维数组对象(矩阵),所有元素必须是相同类型。
属性有:ndim(维度个数),shape(各维度大小),dtype(数据类型)
'''
def create():
    # 生成一个ndarray
    data=[[1,2],[3,4],[5,6]]
    x=npy.array(data)
    print(x)
    print("x.dtype=",x.dtype)
    print("x.dim=",x.ndim)
    print("x.shape=",x.shape)
    # ones:创造全1矩阵 ones_like:以另一个矩阵为参数,根据它的维度大小和数据类型创造全1矩阵
    y=npy.ones((2,3));print(y)
    print("y.dtype=",y.dtype)
    y=npy.ones_like(x);print(y)
    # zeros:创造全0矩阵 zeros_like
    # 可以指定元素类型
    y=npy.zeros((2,3),dtype=npy.int32);print(y)
    # empty:创造只分配内存的空矩阵 empty_like
    y=npy.empty((2,3));print(y)
    # 运用where生成一个数组:
    # 输入三个参数,第一个为bool数组,第二三个可为元素,可为数组
    # 对于第一个数组,如果一个元素为True,从a1中取对应元素,否则从a2中取
    a1=npy.array([1,2,3]);a2=npy.array([4,5,6])
    print(npy.where([True,False,False],a1,a2))

输出结果:

[[1 2]
 [3 4]
 [5 6]]
x.dtype= int32
x.dim= 2
x.shape= (3, 2)
[[1. 1. 1.]
 [1. 1. 1.]]
y.dtype= float64
[[1 1]
 [1 1]
 [1 1]]
[[0 0 0]
 [0 0 0]]
[[1. 1. 1.]
 [1. 1. 1.]]
[1 5 6]

类型转化

'''
主要类型:
int8,uint8,int16,uint16,int32,uint32,int64,uint64
float16,float32,float64,float128
complex64,complex128,complex256
bool,obejct
string_,unicode_
'''
def TypeTrans():
    data=['1','2','3','4']
    x=npy.array(data,dtype=npy.string_)
    # 使用astype进行类型转化
    y=x.astype(npy.int32)
    print(y)

输出结果:

[1 2 3 4]

运算

def OperationTest():
    data_x=[1,2,3,4];data_y=[2,2,2,2]
    x=npy.array(data_x);y=npy.array(data_y)
    print(x*2) #所有元素乘以2
    print(x+y) #对应元素相加
    print(x>y) #对应元素进行大小比较
    print(npy.maximum(x,y)) #对应元素求最大值
    print(npy.logical_and(x,y)) #与运算(相应的还有或、异或)

输出:

[2 4 6 8]
[3 4 5 6]
[False False  True  True]
[2 2 3 4]
[ True  True  True  True]

切片

麻麻我在python里有多维数组用了

def Slice():
    data=[[1,2],[3,4],[5,6]]
    x=npy.array(data)
    print(x[0])
    print(x[1][0])
    print(x[1,0])
    print(x[0:2])

输出:

[1 2]
3
3
[[1 2]
 [3 4]]

索引

'''
索引
布尔索引:输入一个相同尺寸的ndarray,将为真的值提取出来
花式索引:使用坐标list进行索引
'''
def Indexing():
    data=[1,2,3,4,5,6]
    x=npy.array(data)
    print(x%2==0)
    print(x[x%2==0]) #使用一个bool型ndarray进行索引
    data2=[[1,2,3],[4,5,6],[7,8,9]]
    y=npy.array(data2)
    print(y[y%2==0])
    print(y[[0,2]]) #使用坐标list进行索引

输出:

[False  True False  True False  True]
[2 4 6]
[2 4 6 8]
[[1 2 3]
 [7 8 9]]

转置

def Shaping():
    x=npy.arange(8) #x=[0,1,2,3,4,5,6,7]
    y=x.reshape(2,2,2) #修改x的尺寸,不改变元素顺序
    print("y=",y)
    # 转置(不改变z)
    z=x.reshape(2,4)
    print("z=",z)
    print("z.T=",z.T)
    # 轴对换:将不同维度进行对换,第几维为原来的第几维
    print(y.transpose(1,0,2))
    # 交换前两维
    print(y.swapaxes(0,1))

输出:

y= [[[0 1]
  [2 3]]

 [[4 5]
  [6 7]]]
z= [[0 1 2 3]
 [4 5 6 7]]
z.T= [[0 4]
 [1 5]
 [2 6]
 [3 7]]
[[[0 1]
  [4 5]]

 [[2 3]
  [6 7]]]
[[[0 1]
  [4 5]]

 [[2 3]
  [6 7]]]

函数

def FunctionTest():
    data=[[1.23,-2.64],[-3.75,2.44]]
    x=npy.array(data)
    print(npy.modf(x)) #分别提取整数部分和小数部分
    print(npy.rint(x)) #四舍五入
    print(npy.sign(x)) #符号
    print(npy.fabs(x)) #绝对值
    #除此以外还有sqrt,square,exp,log,sin,arcsin……

输出:

(array([[ 0.23, -0.64],
       [-0.75,  0.44]]), array([[ 1., -2.],
       [-3.,  2.]]))
[[ 1. -3.]
 [-4.  2.]]
[[ 1. -1.]
 [-1.  1.]]
[[1.23 2.64]
 [3.75 2.44]]

统计

def Statistics():
    x=npy.array([[1,2],[3,3],[2,1]])
    print(x.mean()) #求算术平均值
    print(x.mean(axis=0)) #求每一列的算术平均值
    print(x.mean(axis=1)) #求每一行的算术平均值
    print(x.sum()) #求和
    print(x.max()) #最大值
    print(x.std()) #标准差
    print(x.var()) #方差
    print(x.argmax()) #最大值的索引
    print(x.cumsum()) #累和
    print(x.cumprod()) #累积
    x.sort(axis=1) #排序
    print(x)

输出:

2.0
[2. 2.]
[1.5 3.  1.5]
12
3
0.816496580927726
0.6666666666666666
2
[ 1  3  6  9 11 12]
[ 1  2  6 18 36 36]
[[1 2]
 [3 3]
 [1 2]]

线性代数操作

import numpy.linalg as nla
def LinearAlgebra():
    x=npy.array([[1,2],[3,4]])
    y=npy.array([[1,3],[2,4]])
    z=npy.array([1,2])
    print(npy.diag(x)) #矩阵提取对角元素
    print(npy.diag(z)) #数组转对角矩阵
    print(npy.dot(x,y)) #矩阵乘法
    print(x.trace()) #迹
    print(nla.det(x)) #行列式
    print(nla.inv(x)) #逆
    print(nla.eig(x)) #特征值和特征向量
    print(nla.pinv(x)) #Moore-Penrose逆
    print(nla.qr(x)) #QR分解
    print(nla.svd(x)) #奇异值分解
    print(nla.solve(x,y.T)) #解方程Ax=b(A:x,b:y) lstsq:最小二乘解

输出:

[1 4]
[[1 0]
 [0 2]]
[[ 5 11]
 [11 25]]
5
-2.0000000000000004
[[-2.   1. ]
 [ 1.5 -0.5]]
(array([-0.37228132,  5.37228132]), array([[-0.82456484, -0.41597356],
       [ 0.56576746, -0.90937671]]))
[[-2.   1. ]
 [ 1.5 -0.5]]
(array([[-0.31622777, -0.9486833 ],
       [-0.9486833 ,  0.31622777]]), array([[-3.16227766, -4.42718872],
       [ 0.        , -0.63245553]]))
(array([[-0.40455358, -0.9145143 ],
       [-0.9145143 ,  0.40455358]]), array([5.4649857 , 0.36596619]), array([[-0.57604844, -0.81741556],
       [ 0.81741556, -0.57604844]]))
[[1. 0.]
 [0. 1.]]

随机数

import numpy.random as nrd
def Random():
    x=nrd.randint(0,2,size=100000) #生成很多随机数
    print((x>0).sum())
    print(nrd.normal(size=(2,2))) #用正态分布随机数产生2*2的矩阵

输出:

50004
[[ 1.09181485  0.22671881]
 [ 0.31331411 -0.09225525]]

暂无评论

发表评论


京公网安备 11010802033049号