欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

numpy

程序员文章站 2022-05-20 11:10:20
一、NumPy简介: NumPy是python一个包。它是一个由多为数组对象和用于处理数字的例程集合组成的库。 二、Ndarray对象 NumPy中的数组类称为ndarray,ndarray是一系列同类型数据的集合,以0下标为开始进行集合的索引。 ndarray对象用于存放同类型元素的多维数组。 n ......

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是一样的

本文地址:https://blog.csdn.net/KWHua/article/details/111997911