numpy库函数操作

http://www.runoob.com/numpy/numpy-tutorial.html

https://blog.csdn.net/u012474716/article/details/78709464

https://blog.csdn.net/guoziqing506/article/details/71078576

https://zhuanlan.zhihu.com/p/24309547

1、创建

import numpy as np

# 1、指定矩阵数据类型
arr=np.array([[1,2,3],
              [4,5,6]],
              dtype=np.float64) # 我的电脑np.int是int32,还可以使用np.int32/np.int64/np.float32/np.float64
print(arr.dtype)


# 2、用np.arange()生成数列
arr=np.arange(6,12)
print(arr)

# 3、用np.linspace(开始,结束,多少点划分线段),同样也可以用reshape()
arr=np.linspace(1,5,3)
print(arr)

# 4、用np.zeros()生成全零矩阵
arr_zeros=np.zeros( (2,3) )
print(arr_zeros)

# 用np.ones()生成全一矩阵
arr_ones=np.ones( (2,3) )
print(arr_ones)

# 5、生成随机矩阵np.random.random()
arr_random=np.random.random((2,3))
print(arr_random)

# 6、创建一个一维数组,元素值是把3重复4次,array([3, 3, 3, 3])
f = np.repeat(3, 4)


# 用np.arange().reshape()将数列转成矩阵
arr=np.arange(6,12).reshape( (2,3) )
print(arr)

np.save('p.npy', p)     # 保存到文件
q = np.load('p.npy')    # 从文件读取

h = g.astype(np.float)  # 用另一种类型表示
# 1、numpy索引
arr1=np.array([1,2,3,6])
arr2=np.arange(2,8).reshape(2,3)

print(arr1[0]) # 索引从0开始计数

print(arr2[0][2]) # arr[行][列],也可以用arr[行,列]
print(arr2[0,:]) # 用:来代表所有元素的意思
print(arr2[0,0:3]) # 表示输出第0行,从第0列到第2列所有元素
                   # 注意python索引一般是左闭右开

# 2、通过for循环每次输出矩阵的一行
for row in arr2:
    print(row)

# 3、如果要每次输出矩阵的一列,就先将矩阵转置
arr2_T=arr2.T
print(arr2_T)
for row in arr2_T:
    print(row)

# 将矩阵压成一行逐个输出元素
arr2_flat=arr2.flatten()
print(arr2_flat)

for i in arr2.flat: # 也可以用arr2.flatten()
    print(i)

2、操作 

import numpy as np


a = np.arange(24).reshape((2, 3, 4))
'''
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],

       [[12, 13, 14, 15],
        [16, 17, 18, 19],
        [20, 21, 22, 23]]])
'''

b = a[1][1][1]  # 17

'''
array([[ 8,  9, 10, 11],
       [20, 21, 22, 23]])
'''
c = a[:, 2, :]

''' 用:表示当前维度上所有下标
array([[ 1,  5,  9],
       [13, 17, 21]])
'''
d = a[:, :, 1]

''' 用...表示没有明确指出的维度
array([[ 1,  5,  9],
       [13, 17, 21]])
'''
e = a[..., 1]

'''
array([[[ 5,  6],
        [ 9, 10]],

       [[17, 18],
        [21, 22]]])
'''
f = a[:, 1:, 1:-1]

'''
平均分成3份
[array([0, 1, 2]), array([3, 4, 5]), array([6, 7, 8])]
'''
g = np.split(np.arange(9), 3)

'''
按照下标位置进行划分
[array([0, 1]), array([2, 3, 4, 5]), array([6, 7, 8])]
'''
h = np.split(np.arange(9), [2, -3])

l0 = np.arange(6).reshape((2, 3))
l1 = np.arange(6, 12).reshape((2, 3))

'''
vstack是指沿着纵轴拼接两个array,vertical
hstack是指沿着横轴拼接两个array,horizontal
更广义的拼接用concatenate实现,horizontal后的两句依次等效于vstack和hstack
stack不是拼接而是在输入array的基础上增加一个新的维度
'''
m = np.vstack((l0, l1))
p = np.hstack((l0, l1))
q = np.concatenate((l0, l1))
r = np.concatenate((l0, l1), axis=-1)
s = np.stack((l0, l1))

'''
按指定轴进行转置
array([[[ 0,  3],
        [ 6,  9]],

       [[ 1,  4],
        [ 7, 10]],

       [[ 2,  5],
        [ 8, 11]]])
'''
t = s.transpose((2, 0, 1))

'''
默认转置将维度倒序,对于2维就是横纵轴互换
array([[ 0,  4,  8],
       [ 1,  5,  9],
       [ 2,  6, 10],
       [ 3,  7, 11]])
'''
u = a[0].transpose()	# 或者u=a[0].T也是获得转置

'''
逆时针旋转90度,第二个参数是旋转次数
array([[ 3,  2,  1,  0],
       [ 7,  6,  5,  4],
       [11, 10,  9,  8]])
'''
v = np.rot90(u, 3)

'''
沿纵轴左右翻转
array([[ 8,  4,  0],
       [ 9,  5,  1],
       [10,  6,  2],
       [11,  7,  3]])
'''
w = np.fliplr(u)

'''
沿水平轴上下翻转
array([[ 3,  7, 11],
       [ 2,  6, 10],
       [ 1,  5,  9],
       [ 0,  4,  8]])
'''
x = np.flipud(u)

'''
按照一维顺序滚动位移
array([[11,  0,  4],
       [ 8,  1,  5],
       [ 9,  2,  6],
       [10,  3,  7]])
'''
y = np.roll(u, 1)

'''
按照指定轴滚动位移
array([[ 8,  0,  4],
       [ 9,  1,  5],
       [10,  2,  6],
       [11,  3,  7]])
'''
z = np.roll(u, 1, axis=1)
arr1=np.array([1,2,3,6])
arr2=np.arange(4)

# 1、矩阵减法,加法同理
arr_sub=arr1-arr2

# 2、矩阵乘法
arr_multi=arr1**3 # 求每个元素的立方,在python中幂运算用**来表示
arr_multi=arr1*arr2 # 元素逐个相乘
arr_multi=np.dot(arr1, arr2.reshape((4,1))) # 维度1*4和4*1矩阵相乘
arr_multi=np.dot(arr1.reshape((4,1)), arr2.reshape((1,4))) # 维度4*1和1*4矩阵相乘
arr_multi=arr1.dot(arr2.reshape((4,1))) # 也可以使用矩阵名.doc(矩阵名)

# 3、三角运算:np.sin()/np.cos()/np.tan()
arr_sin=np.sin(arr1)

# 4、逻辑运算
print(arr1<3) # 查看arr1矩阵中哪些元素小于3,返回[ True  True False False]

# 5、矩阵求和,求矩阵最大最小值
arr1=np.array([[1,2,3],[4,5,6]])
print(np.sum(arr1)) # 矩阵求和
print(np.sum(arr1,axis=0)) # 矩阵每列求和
print(np.sum(arr1,axis=1).reshape(2,1)) # 矩阵每行求和

print(np.min(arr1)) # 求矩阵最小值
print(np.min(arr1,axis=0))

print(np.max(arr1)) # 求矩阵最大值
print(np.mean(arr1)) # 输出矩阵平均值,也可以用arr1.mean()
print(np.median(arr1)) # 输出矩阵中位数

# 输出矩阵某些值的位置
print(np.argmin(arr1)) # 输出矩阵最小值的位置,0
print(np.argmax(arr1)) # 输出矩阵最大值的位置,11
print(np.cumsum(arr1)) # 输出前一个数的和,前两个数的和,等等

print(np.diff(arr1)) # 输出相邻两个数的差值


# 6、矩阵逐行排序
print(np.sort(arr1)) # 矩阵逐行排序

# 7、矩阵转置,也可以用arr1.T
print(np.transpose(arr1)) # 矩阵转置,也可以用arr1.T

#8、将矩阵中小于5的数置5,大于9的数置9
print(np.clip(arr1,5,9)) #将矩阵中小于5的数置5,大于9的数置9

import numpy as np

# 绝对值,1
a = np.abs(-1)

# sin函数,1.0
b = np.sin(np.pi/2)

# tanh逆函数,0.50000107157840523
c = np.arctanh(0.462118)

# e为底的指数函数,20.085536923187668
d = np.exp(3)

# 2的3次方,8
f = np.power(2, 3)

# 点积,1*3+2*4=11
g = np.dot([1, 2], [3, 4])

# 开方,5
h = np.sqrt(25)

# 求和,10
l = np.sum([1, 2, 3, 4])

# 平均值,5.5
m = np.mean([4, 5, 6, 7])

# 标准差,0.96824583655185426
p = np.std([1, 2, 3, 2, 1, 3, 2, 0])
# 线性代数模块(linalg)
# 求范数
a=np.array([5,12])
print(a)
b=np.linalg.norm(a) # norm表示范数,默认求2范数,ord=1求1范数,ord=np.inf求无穷范数
print(b)

# 求矩阵的迹、行列式、秩、特征值、特征向量
b = np.array([
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
])

print(np.trace(b))      # 15,求矩阵的迹(主对角线上各个元素的总和)

c=np.linalg.det(b)
print(c)                # 输出一个很小的值6.66133814775e-16,求矩阵的行列式值
                        # 如果希望输出为0,使用round(c, 2),四舍五入保留小数点后两位
                        # 不过对精度要求高可以使用decimal模块

c=np.linalg.matrix_rank(b)
print(c)                # 2,求矩阵的秩

u,v=np.linalg.eig(b) # u为特征值
print(u)
print(v)

# 矩阵分解
# Cholesky分解并重建
d = np.array([
    [2, 1],
    [1, 2]
])

l = np.linalg.cholesky(d)
print(l) # 得到下三角矩阵
e=np.dot(l, l.T)
print(e) # 重建得到矩阵d


# 对不正定矩阵,进行SVD分解并重建
U, s, V = np.linalg.svd(d)

S = np.array([
    [s[0], 0],
    [0, s[1]]
])

print(np.dot(U, np.dot(S, V))) # 重建得到矩阵d

# 矩阵乘法
# https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html#numpy.dot
print(np.dot(3, 4)) # 12,0-D矩阵相乘(也就是标量相乘)

print(np.dot([2j, 3j], [2j, 3j])) # (-13+0j),1-D矩阵相乘(实际上是向量做点积)

a=[[1, 0], [0, 1]]
b=[[4, 1, 0], [2, 2, 0]]
print(np.dot(a, b))
'''
array([[4, 1],
    [2, 2]])
2-D矩阵相乘
这里是2*2矩阵和2*3矩阵相乘,结果为2*3矩阵
'''

a=[[1, 0], [1, 2]]
b=[2,2]
c=np.dot(a,b)
print(c) 
'''
[2 6]
注意这里b是向量
numpy处理时并不是按照矩阵乘法规则计算
而是向量点积
也就是np.dot([1, 0],[1, 2])和np.dot([1, 2],[2,2])
'''

# 再做个实验来区别向量乘法和矩阵乘法
b=np.array([
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
])

# 这里插播一下,np.array([1,0,1])是3维向量,而不是1*3的矩阵
c1=np.array([[1,0,2]]) 
print(c1.shape) # (1, 3),这是一个1*3的矩阵
c2=np.array([1,0,2])
print(c2.shape) # (3,),这是一个3维向量

# print(np.dot(b,c1)) # 报错,不符合矩阵乘法规则
print(np.dot(b,c2)) # [ 7 16 25],点积运算

print(np.dot(c1,b)) # [[15 18 21]],矩阵乘法运算规则
print(np.dot(c2,b)) # [15 18 21],点积运算

# 还要补充一下,如果是用python自带的*运算符计算则是广播机制
print(b*c1) # print(b*c2)结果一样
'''
[[ 1  0  6]
 [ 4  0 12]
 [ 7  0 18]]
'''
print(b+c1) # print(b*c2)结果一样
'''
[[ 2  2  5]
 [ 5  5  8]
 [ 8  8 11]]
'''

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值