numpy

4 篇文章 0 订阅
1 篇文章 0 订阅

numpy矩阵

numpy:计算模块;主要有两种数据类型:数组和矩阵
特点:运算快
[]+[]

1、numpy创建矩阵

import numpy as np
mat1 = np.mat('1 2 3;2 3 4;1 2 2')
mat1
print(type(mat1))
<class 'numpy.matrixlib.defmatrix.matrix'>
mat2 = np.mat('1 3;4 7;2 4')
mat2
matrix([[1, 3],
        [4, 7],
        [2, 4]])

2、矩阵的计算

mat3 = np.mat('1 4 3;2 3 3;1 2 6')
print('矩阵加法运算:\n',mat1+mat3)
矩阵加法运算:
 [[2 6 6]
 [4 6 7]
 [2 4 8]]
print('矩阵的乘法: \n',mat1*mat2)

矩阵的乘法: 
 [[15 29]
 [22 43]
 [13 25]]
print('矩阵的转置:\n',mat1.T)
矩阵的转置:
 [[1 2 1]
 [2 3 2]
 [3 4 2]]
mat4 = np.mat('1 2 3;2 4 3;1 0 1')
print('逆矩阵: \n',mat4.I)
逆矩阵: 
 [[-0.66666667  0.33333333  1.        ]
 [-0.16666667  0.33333333 -0.5       ]
 [ 0.66666667 -0.33333333  0.        ]]
print('矩阵的数乘: \n',4*mat4)
矩阵的数乘: 
 [[ 4  8 12]
 [ 8 16 12]
 [ 4  0  4]]
print('对应元素相乘的运算: \n',np.multiply(mat1,mat3))
对应元素相乘的运算: 
 [[ 1  8  9]
 [ 4  9 12]
 [ 1  4 12]]

二、矩阵属性

print('矩阵的结构: \n',mat1.shape)  # 几乘几的矩阵
矩阵的结构: 
 (3, 3)
print('矩阵的元素个数: \n',mat1.size)  # 矩阵的元素的个数
矩阵的元素个数: 
 9
print('矩阵的元素类型: \n',mat1.dtype)  # 矩阵的元素的类型
矩阵的元素类型: 
 int32
print('矩阵的维度: \n',mat1.ndim)  # 矩阵的维度
矩阵的维度: 
 2

三、数组的创建

  1. 数组的所有运算都是对应元素的运算;
arr1 = np.array([1,2,3,4])
print(arr1)  # [1 2 3 4]
print(type(arr1))  # <class 'numpy.ndarray'>
[1 2 3 4]
<class 'numpy.ndarray'>
#二维的数组
arr2 = np.array([[1,2,3],[4,5,6],[7,8,9]])
print(arr2)  # [[1 2 3]
 # [4 5 6]
 # [7 8 9]]
[[1 2 3]
 [4 5 6]
 [7 8 9]]
# 创建列向量类型的数组
arr3 = np.array([[1],[2],[3],[4]])
print(arr3)
#[[1]
#[2]
# [3]
# [4]]
#
[[1]
 [2]
 [3]
 [4]]

2.数组的属性

print('一维数组的结构: ',arr1.shape)  # 一维数组的结构:  (4,)
print('二维数组的结构: \n',arr2.shape)  #  二维数组的结构: (3, 3)
一维数组的结构:  (4,)
二维数组的结构: 
 (3, 3)
print('一维数组元素的个数: ',arr1.size)  # 一维数组元素的个数:  4
print('二维数组元素的个数: ',arr2.size) # 二维数组元素的个数:  9
一维数组元素的个数:  4
二维数组元素的个数:  9
print('一维数组元素的类型:',arr1.dtype)  # 一维数组元素的类型: int32
print('二维数组元素的类型:',arr2.dtype)  # 二维数组元素的类型: int32
一维数组元素的类型: int32
二维数组元素的类型: int32
print('一维数组元素的维度:',arr1.ndim)  # 一维数组元素的维度: 1
print('二维数组元素的维度:',arr2.ndim)  # 二维数组元素的维度: 2
一维数组元素的维度: 1
二维数组元素的维度: 2

3.数组的索引

# 一维数组的索引和切片:和python的列表和字符串一样
arr1[::-1] #
array([4, 3, 2, 1])
# 二维数组的切片: 数组名[行切片,列切片]
print(arr2)
# [[1 2 3]
# [4 5 6]
# [7 8 9]]

arr2[1,2]   # 6
arr2[1,0:2]  # array([4, 5])

arr2[::2,::2]  # array([[1, 3],
                 #      [7, 9]])

arr2[1:,1:]  # array([[5, 6],
           #          [8, 9]])

arr2[:2,::2]  #array([[1, 3],
              #       [4, 6]])
[[1 2 3]
 [4 5 6]
 [7 8 9]]





array([[1, 3],
       [4, 6]])
# 针对取出不同列不同行的元素  元组内对应坐标
# 取出数组中的1 ,5,9
arr2[(0,1,2),(0,1,2)] 
# 取出2,4,6
arr2[(0,1,1),(1,0,2)]
# 取出3,5,7
arr2[(0,1,2),(2,1,0)]
array([3, 5, 7])
# bool取值  如果一个传入为行列取值,两个都传入代表元组取值
mask = np.array([1,0,1],dtype=np.bool)
print(mask)
[ True False  True]
arr2[mask,:2]  # true代表切,false代表不切
# array([[1, 2],
#       [7, 8]])
# arr2[mask,mask]  # array([1, 9])
array([[1, 2],
       [7, 8]])

4.特殊函数创建数组

#(1) 类似于range
arr6 = np.arange(1,10,1)
print(arr6)
[1 2 3 4 5 6 7 8 9]
#(2)  等差数列:
# np.linspace(start=a1,stop=an,endpoint=True,retstep=False,dtype=None,=0) 第一项,最后一项,之间有几个数
# 参数说明
# endpoint = True:表示等差数列,在start与stop之间插入n-2个值:(n为数值的个数)
# endpoint = False:表示等差数列,在start和stop之间插入n-1个值,表示平均分成n份(n为数值的个数)
  File "<ipython-input-28-6d811962123c>", line 4
    endpoint = True:表示等差数列,在start与stop之间插入n-2个值:(n为数值的个数)
                   ^
SyntaxError: invalid syntax
arr7 = np.linspace(2,5,5)
print(arr7)
# a1=8  d =  -1  n = 7 
arr8 = np.linspace(8,2,7)
print(arr8)  # [ 8.  7.  6.  5.  4.  3.  2.] 
#(3)等比数列
arr9 = np.logspace(1,5,5)
print(arr9)
# a1 = 2 , q = 2 , n= 10
arr10 = np.logspace(1,10,10,base=2)
print(arr10)
# a1 = 3 , q = 9 , n=6
arr10 =np.logspace(1,11,6,base=3)
print(arr10)
import math
# a1 = 2  q = 3  n = 5
arr11 = np.logspace(1,math.log2(162),5,base=2) 
print(arr11)

# (4) 全一数组  ones
a1 = np.ones((2,3))
print(a1)
# (5)全零数组  zeros
a2 = np.zeros((3,3))
print(a2)
# (6)单位数组  eye
arr13 = np.eye(3)
print(arr13)
# (7)对角数组  diag
arr12 = np.diag([1,2,3,4])
print(arr12)

5.创建随机数组

# (1)创建n个0-1之间的一维随机数组
arr14 = np.random.random(10)  # 创建的是10个0-1之间的一维的随机数组
print(arr14)
# (2)创建服从均匀分布的随机数组
arr15 = np.random.rand(100)
print(arr15)
import matplotlib.pyplot as plt


plt.figure()
plt.hist(arr15,10)
plt.show()
# (3)创建正态分布数组的随机数
arr16 = np.random.randn(10000)
plt.hist(arr16,10)
plt.show()

# (4)随机整数的生成  low <= x < high
# size可以是一个数,也可以是元组,(行,列)
np.random.randint(2,4,size=4).reshape((2,2))
np.random.randint(1,6,size=(3,9))

6.矩阵的形态变换

# (1)重置数组结构(reshape)
arr_1 = np.arange(10)
print(arr_1)
arr_2 =arr_1.reshape((2,5))
print(arr_2)
# (2)展平数组(ravel):二维-->一维  横向展平
arr_2.ravel()
# (3)展平数组(flatten)  默认为C  代表横向展平  F代表纵向展平
arr_2.flatten('C')  # array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

arr_2.flatten('F')  # array([0, 5, 1, 6, 2, 7, 3, 8, 4, 9])
# (4)堆叠方法
arr_3 = np.zeros((3,4))
arr_4 = np.ones((3,4))
# 横向堆叠(hstack(tup))  要求行数一致
arr_5 = np.hstack((arr_3,arr_4))
print(arr_5)
# 纵向堆叠(vstack(tup))  要求列数一致
arr_6 = np.vstack((arr_3,arr_4))
print(arr_6)
# (5)数组合并 concatenate((a1, a2, ...), axis=0)
# 参数详情(a1,a2,a3,....)
# axis  哪个方向进行合并,默认为axis=0 纵向拼接  axis = 1 为横向拼接
arr_7 = np.concatenate((arr_3,arr_4),axis=1)
print(arr_7)

vstack,hstack和concatenate的区别

当数组为二维数组时,没有区别,当数组为一维数组时,它没有axis=1的轴,只有axis=0轴,vstack和hstack不会考虑维度的影响,只要符合条件,就能堆叠,vstack可以改变数组的维度,而concatenate要考虑维度的问题.

ar_1 = np.array([1,2,3,4])
ar_2 = np.array([1,2,3,4])
ar_3 = np.vstack((ar_1,ar_2))
print(ar_3)
# (6) 数组的分割 hsplit横向分割  vsplit纵向分割


# hsplit
arr_8 = np.hsplit(arr_7,4)
print(arr_8)
arr_9 = np.hsplit(arr_7,[4,6,7])  # 将数组按照列的索引分割成(元素个数+1)个数组
print(arr_9)

# vsplit
arr_10 = np.vsplit(arr_6,[1,3])
print(arr_10)

split(ary, indices_or_sections, axis=0)
参数说明
ary: m要切分的数组
indices_or_sections: 切分的要求
axis 切分的方向
注意: 使用的要求和concatenate是一样的

  • 10
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 15
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值