NumPy模块使用介绍

news2024/11/15 17:55:54

NumPy使用介绍

1.NumPy科学计算库介绍和环境准备

​ NumPy(Numerical Python)是Python的⼀种开源的数值计算扩展。提供多维数组对象,各种派⽣对象(如掩码数组和矩阵),这种⼯具可⽤来存储和处理⼤型矩阵,⽐Python⾃身的嵌套列表(nested list structure)结构要⾼效的多( 该结构也可以⽤来表示矩阵matrix ),⽀持⼤量的维度数组与矩阵运算,此外也针对数组运算提供⼤量的数学函数库,包括数学、逻辑、形状操作、排序、选择、输⼊输出、离散傅⽴叶变换、基本线性代数,基本统计运算和随机模拟等等

  • ⼏乎所有从事Python⼯作的数据分析师都利⽤NumPy的强⼤功能

    • 强⼤的N维数组
    • 成熟的⼴播功能
    • ⽤于整合C/C++和Fortran代码的⼯具包
    • NumPy提供了全⾯的数学功能、随机数⽣成器和线性代数功能
  • 安装Python库

    • pip install jupyter -i https://pypi.tuna.tsinghua.edu.cn/simple
      
    • pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple
      
    • Jupyter Notebook是一款开发工具,基于网页的用于交互计算的应用程序。其可被应用于全过程计算:开发、文档编写、运行代码和展示结果,经常可以大大增加调试代码效率

  • 启动命令行终端

    • Windows----> 快捷键:win + R ----->输⼊:cmd回⻋------>命令⾏出来
    • Mac ---->启动终端
  • 命令行终端中启动jupyter

    • 进⼊终端输⼊指令:jupyter notebook

    • [注意]:在哪⾥启动jupyter启动,浏览器上的⽬录,对应哪⾥

启动后有几处需要注意:

  1. 会生成一个html连接文件,直接打开即可进入到jupyter操作界面( C:\Users\Administrator\AppData\Roaming\jupyter\runtime\nbserver-14956-open.html )

  2. 或者复制提供的连接进行访问,例如:http://localhost:8888/?token=3566fc51fefd4fb9528c5a131d7f0beb7cc8c171639fff14

  3. token是用户验证的密钥信息

  4. 如果只打开了IP加8888端口,则在Password or token:中输入token验证,点击login即可登录

  5. 登录后可以在New选项中,创建一个目录、创建一个开发代码文件、开发代码交互界面

初次感受jupyter:

jupyter最常用快捷键

shift + tab 函数用法介绍
tab键,代码补全
alt + enter,运行当前单元,并在下方插入一单元
ctrl + enter,运行当前单元,光标依然在当前单元格
esc 后 b键,在下方插入 ,a键,在上方插入单元
esc 后 2次d键,删除当前单元格

帮助中有全部快捷键大全

对比pycharm:

功能代码最终都可以实现功能,jupyter相对可以快速部署使用,引用变量即可OutPut输出;有些地方为了代码展示会使用pycharm更方便,所以后续都会使用到。

2.NumPy基本操作

2-1.创建数组

创建数组的最简单的⽅法就是使⽤array函数,将Python下的list转换为ndarray

例如上方的代码

import numpy as np

blizzard_game = ["魔兽世界", "守望先锋", "炉石传说", "魔兽争霸", "暗黑破坏神", "星际争霸", "风暴英雄"]
arr = np.array(blizzard_game)
arr
blizzard_game

numpy.array() 将列表转换为NumPy数组

从输出的内容看,数据是⼀样的

但是随着后续的使用会慢慢了解到同样的内容,NumPy数组的⽅法,功能更加强⼤,要比list能实现更多强大的功能

[注意]:np 和 numpy 后续都指numpy库模块,只是别名并无区别

​ 我们可以利⽤np中的⼀些内置函数来创建数组,⽐如我们创建全0的数组,也可以创建全1数组,全是其他数字的数组,或者等差数列数组,正态分布数组,随机数。

  • 创建n个0或者n个1的数组
import numpy as np

arr1 = np.zeros(5)
arr2 = np.ones(5)
print(arr1)
print(arr2)

""" 输出
[0. 0. 0. 0. 0.]
[1. 1. 1. 1. 1.]
"""
  • 创建以某个值 x行y列的数组
import numpy as np

arr = np.full(shape=[2, 4], fill_value="暴雪凉凉了")
print(arr)

""" 输出
[['暴雪凉凉了' '暴雪凉凉了' '暴雪凉凉了' '暴雪凉凉了']
 ['暴雪凉凉了' '暴雪凉凉了' '暴雪凉凉了' '暴雪凉凉了']]
"""

shape=[2, 4] 行、列

fill_value 创建的内容

  • 创建等差数列型数组
import numpy as np

arr = np.arange(start=0, stop=30, step=5)
print(arr)

""" 输出
[ 0  5 10 15 20 25]
"""
  • 创建int随机整数数组
import numpy as np

arr = np.random.randint(1, 7, size=6)
print(arr)

""" 输出
[5 5 5 1 3 3]
"""

传入3个参数分别对应为

low 最小区间,包含low值

high 最大区间,不包含high值

size 取几个值

  • 创建正态分布和随机数数组
import numpy as np

arr1 = np.random.randn(6)
arr2 = np.random.random(size=6)
print(arr1)
print(arr2)

""" 输出
[-1.31009666  1.26289427 -0.90216964 -0.52891451 -0.02613398  2.99314766]
[0.5897261  0.53644782 0.54970934 0.60330606 0.02733836 0.80834182]
"""

使用random.random函数会返回一个[0.0,1.0)之间的随机数值,zise定义输出个数;

而random.randn函数是返回一个标准正太分布数值,即理论上是(负无穷,正无穷)。实际上是在数值0附近徘徊

2-2.查看操作

​ NumPy的数组类称为ndarray,也被称为别名 array。请注意,numpy.array这与标准Python库类不同array.array,后者仅处理⼀维数组且功能较少

  • jupyter扩展插件
pip install jupyter_contrib_nbextensions -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install jupyter_nbextensions_configurator -i https://pypi.tuna.tsinghua.edu.cn/simple
jupyter contrib nbextension install --user
jupyter nbextensions_configurator enable --user
  • jupyter_contrib_nbextensions
    • 这个包能够对jupyter notebook进行扩展,丰富它的功能,比如函数代码的收叠,对于较长的notebook也可以通过它添加左边目录栏,便于定位
  • JupyterNbExtensions Configurator
    • 是Jupyter Notebook的一个扩展工具,只需勾选相应插件就能自动载入。可以让你在Jupyter Notebook上的工作效率进一步的提高

这样新启动的jupyter book会多一个新的菜单分页Nbextensions

可以理解成有一些其它工具例如pycharm等比较好的功能通过扩展插件来实现,扩展工具可以不安装,

  • 查看数组的轴数、维度
import numpy as np

arr = np.random.randint(0, 100, size=(3, 4, 5))
print(arr.ndim)

""" 输出
3
"""
  • 查看数组尺寸形状
import numpy as np

arr = np.random.randint(0, 100, size=(3, 4, 5))
print(arr.shape)

""" 输出
(3, 4, 5)
"""

3组 4行 5列

  • 查看数组元素的总数
import numpy as np

arr1 = np.random.randint(0, 100, size=(3, 4, 5))
arr2 = np.random.randint(0, 100, size=(1, 2, 6))
print(arr1.size)
print(arr2.size)

""" 输出
60
12
"""

数组元素的总数相当于各维度的乘积

60 = 3 * 4 * 5

12 = 1 *2 * 6

  • 查看数组的数据类型
import numpy as np

arr = np.random.randint(0, 100, size=(3, 4, 5))
print(arr.dtype)

""" 输出
int32
"""
  • 查看数组中每个元素的大小
import numpy as np

arr = np.random.randint(0, 100, size=(3, 4, 5))
print(arr.itemsize)

""" 输出
4
"""

数据类型为int32,⼀个字节是8位,相除得出4

2-3文件IO操作

  • 保存数组

save⽅法保存ndarray到⼀个npy⽂件,也可以使⽤savez将多个array保存到⼀个.npz⽂件中

import numpy as np

x = np.random.randn(3)
y = np.arange(0, 5, 1)
np.save("./wangt/xxx_arr", x)
np.savez("./wangt/some_array.npz", xarr=x, yarr=y)

通过jupyter创建:

  • 读取数组

​ 使用load⽅法来读取存储的数组,如果是.npz⽂件的话,读取之后相当于形成了⼀个key-value类型的变量,通过保存时定义的key来获取相应的array

import numpy as np

np.load('./wangting/xxx_arr.npy')
print(np.load('./wangting/some_array.npz')['yarr'])

""" 输出
[0 1 2 3 4]
"""
  • 读写csv、txt文件
import numpy as np

arr = np.random.randint(0, 10, size=10)
np.savetxt("./wangt/arr_20221203.csv", arr, delimiter=',')
np.savetxt("./wangt/arr_20221203.txt", arr, delimiter=',')

np.loadtxt("./wangt/arr_20221203.csv", delimiter=',', dtype=np.int32)
np.loadtxt("./wangt/arr_20221203.txt", delimiter=',', dtype=np.int32)
print(np.loadtxt("./wangt/arr_20221203.csv", delimiter=',', dtype=np.int32))
print("-----")
print(np.loadtxt("./wangt/arr_20221203.txt", delimiter=',', dtype=np.int32))

""" 输出
[3 5 0 2 4 5 2 7 0 6]
-----
[3 5 0 2 4 5 2 7 0 6]
"""

3.NumPy数据类型介绍

ndarray的数据类型:

  • int

    • int8
    • uint8
    • int16
    • int32
    • int64
  • float

    • float16
    • float32
    • float64
  • str

可以在创建时指定:

import numpy as np
np.array([1,2,3],dtype = 'float32')

可以在asarray转换时指定:

import numpy as np
arr = [1,2,3,4]
np.asarray(arr,dtype = 'float32')

可以在数据类型转换astype时转换:

import numpy as np
arr = np.random.randint(0,10,size = 5,dtype = 'int16')
arr.astype('float32') 

4.NumPy数组运算

  • 逻辑运算
import numpy as np

arr1 = np.array([1, 2, 3, 4, 5])
arr2 = np.array([1, 0, 2, 3, 5])
print(arr1 < 5)
print(arr1 >= 5)
print(arr1 == 5)
print(arr1 == arr2)
print(arr1 > arr2)

""" 输出
[ True  True  True  True False]
[False False False False  True]
[False False False False  True]
[ True False False False  True]
[False  True  True  True False]
"""

数组arr中元素逐个逻辑比较

  • 数组与标量计算
import numpy as np

arr = np.arange(1, 4)
print(1 / arr)
print(arr + 5)
print(arr * 5)

""" 输出
[1.         0.5        0.33333333]
[6 7 8]
[ 5 10 15]
"""
  • *=、+=、-=操作
import numpy as np

arr = np.arange(5)
print(arr)
arr += 2
print(arr)
arr -= 2
print(arr)
arr *= 2
print(arr)

""" 输出
[0 1 2 3 4]
[2 3 4 5 6]
[0 1 2 3 4]
[0 2 4 6 8]
"""

5.NumPy复制和视图

在操作数组时,有时会将其数据复制到新数组中,有时不复制

  • 无复制

在jupyter中,同时输出多个内容用display()

  • 视图、浅拷贝

不同的数组对象可以共享相同的数据。该view⽅法创建⼀个查看相同数据的新数组对象

  • 深拷贝

6.NumPy索引、切片和迭代

  • 基本索引和切片
import numpy as np

a = np.random.randint(0, 20, size=10)
print(a)  # [10 13  4  1  5]
# 取一个值
print(a[0])
# 取多个值
print(a[[0, 1, 3]])
# 切片
print(a[1:3])  # 从索引1切到索引为3(包括前索引不包括后索引)
print(a[:3])  # 从开始位置切到索引3位置
print(a[3:])  # 从索引为3开始切到末尾
print(a[::3])  # 取全部数据,步长为3
print(a[::-1])  # 相当于反转数据

""" 输出
[14  1 14  7  4 10  4 15  6  7]
14
[14  1  7]
[ 1 14]
[14  1 14]
[ 7  4 10  4 15  6  7]
[14  7  4  7]
[ 7  6 15  4 10  4  7 14  1 14]
"""
  • 多维数组索引和切片

​ 对于⼆维数组或者⾼维数组,我们可以按照之前的知识来索引,当然也可以传⼊⼀个以逗号隔开的索引列表来选区单个或多个元素

  • 切片取值
import numpy as np

a = np.arange(20)
print(a)
# [ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19]

b = a[3:7]
print(b)
# [3 4 5 6]

b[0] = 33333
print(a)
# [ 0  1  2  33333  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19]
print(b)
# [33333  4  5  6]

切片时,从返回的数据对比看,切片不是深拷贝,而是浅拷贝

  • 花式索引
import numpy as np

a = np.arange(20)
# 花式索引
b = a[[3, 4, 5, 6]]
print(a)
# [ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19]
print(b)
# [3 4 5 6]

b[0] = 33333
print(a)
# [ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19]
print(b)
# [33333     4     5     6]

使用花式索引时,从返回的数据对比看,花式索引返回的是深拷贝,不再影响原数值

  • 索引常用技巧
import numpy as np

a = np.random.randint(40, 100, size=(12, 3))
print(a)
"""
[[80 61 51]
 [88 98 66]
 [41 81 86]
 [45 50 82]
 [44 98 76]
 [51 56 93]
 [96 61 50]
 [77 77 46]
 [50 40 94]
 [97 48 45]
 [64 85 94]
 [81 82 80]]
"""
# 找出全部数值中大于等于60的值
cond = a >= 60
print(a[cond])
# [80 61 88 98 66 81 86 82 98 76 93 96 61 77 77 94 97 64 85 94 81 82 80]

# boolean True=1;False=0
print(cond[:])
"""
[[ True  True False]
 [ True  True  True]
 [False  True  True]
 [False False  True]
 [False  True  True]
 [False False  True]
 [ True  True False]
 [ True  True False]
 [False False  True]
 [ True False False]
 [ True  True  True]
 [ True  True  True]]
"""

# 找出每行3列数字都大于60的信息
# 相当于用cond每行的True和False去逐个相乘,如果都为True,赋值给cond_new,从而取出每行中元素都大于60的行
cond_new = cond[:, 0] * cond[:, 1] * cond[:, 2]
print(a[cond_new])
"""
[[88 98 66]
 [64 85 94]
 [81 82 80]]
"""

7.NumPy形状操作

  • 数组变形 - reshape

  • 数组转置( 行列互换 ) .T

  • 数组堆叠合并
import numpy as np

a = np.random.randint(0, 10, size=(2, 3))
b = np.random.randint(0, 10, size=(2, 3))
print(a)
# [[0 5 0]
# [7 6 0]]
print(b)
# [[1 8 2]
# [5 1 8]]

# 水平方向-横向行叠加
# 方法1
c = np.concatenate([a, b], axis=0)
print(c)
# 方法2
print(np.vstack((a, b)))
"""
[[0 5 0]
 [7 6 0]
 [1 8 2]
 [5 1 8]]
"""

# 竖直方向-纵向列叠加
# 方法1
d = np.concatenate([a, b], axis=1)
print(d)
# 方法2
print(np.hstack((a, b)))
"""
[[0 5 0 1 8 2]
 [7 6 0 5 1 8]]
"""
  • split数组拆分
import numpy as np

a = np.random.randint(0, 15, size=(6, 6))
print(a)
"""
[[ 2  9  7  0  7 13]
 [ 2  9 10  8  6  7]
 [ 1  8  6  1  8 10]
 [14  6 12  9 13  2]
 [ 5  2  1  1 13  2]
 [ 0 14  8  3  3 12]]
"""
# 等分拆成3份,按照行拆
b = np.split(a, indices_or_sections=3, axis=0)
print(b)
print(np.vsplit(a, indices_or_sections=3))
"""
[array([[ 2,  9,  7,  0,  7, 13],
       [ 2,  9, 10,  8,  6,  7]]), 
 array([[ 1,  8,  6,  1,  8, 10],
       [14,  6, 12,  9, 13,  2]]), 
 array([[ 5,  2,  1,  1, 13,  2],
       [ 0, 14,  8,  3,  3, 12]])]
"""

# 等分拆成2份,按照列拆
c = np.split(a, indices_or_sections=2, axis=1)
print(c)
print(np.hsplit(a, indices_or_sections=2))
"""
[array([[ 2,  9,  7],
       [ 2,  9, 10],
       [ 1,  8,  6],
       [14,  6, 12],
       [ 5,  2,  1],
       [ 0, 14,  8]]), 
array([[ 0,  7, 13],
       [ 8,  6,  7],
       [ 1,  8, 10],
       [ 9, 13,  2],
       [ 1, 13,  2],
       [ 3,  3, 12]])]
"""

# 参数给列表,则根据列表中的索引来进行切片
d = np.split(a, indices_or_sections=[1, 2, 3])
print(d)
"""
[array([[ 2,  9,  7,  0,  7, 13]]), 
array([[ 2,  9, 10,  8,  6,  7]]), 
array([[ 1,  8,  6,  1,  8, 10]]), 
array([[14,  6, 12,  9, 13,  2],
       [ 5,  2,  1,  1, 13,  2],
       [ 0, 14,  8,  3,  3, 12]])]
"""

8.NumPy广播机制

​ 当两个数组的形状并不相同的时候,我们可以通过扩展数组的⽅法来实现相加、相减、相乘等操作,这种机制叫做⼴播(broadcasting)

  • ⼀维数组⼴播

​ 可以简单的理解成一维数组是一条线,二维数组是一个面,现在将一维数组并入到二维中去,那么一条线并入到一个面,那么这条线需要纵向延长成面再与二维面合并,最终目的是为了达到一一对应的效果,才能够做到对应位置的合并。

import numpy as np

arr1 = np.sort(np.array([0, 1, 2, 3] * 3)).reshape(4, 3)
arr2 = np.array([1, 2, 3])
print(arr1)
"""
[[0 0 0]
 [1 1 1]
 [2 2 2]
 [3 3 3]]
"""
print(arr2)
"""
[1 2 3]
"""
print(arr1 + arr2)
"""
[[1 2 3]
 [2 3 4]
 [3 4 5]
 [4 5 6]]
"""
  • 二维数组广播

列不够,纵向补齐

import numpy as np

arr1 = np.sort(np.array([0, 1, 2, 3] * 3)).reshape(4, 3)
arr2 = np.array([[1], [2], [3], [4]])
print(arr1)
"""
[[0 0 0]
 [1 1 1]
 [2 2 2]
 [3 3 3]]
"""
print(arr2)
"""
[[1]
 [2]
 [3]
 [4]]
"""
print(arr1 + arr2)
"""
[[1 1 1]
 [3 3 3]
 [5 5 5]
 [7 7 7]]
"""
  • 三维数组广播

相当于数量份数不等的相加,需要把单份数据复制到份数相同时再相加

import numpy as np

arr1 = np.array([0, 1, 2, 3, 4, 5, 6, 7] * 3).reshape(3, 4, 2)
# arr1为3份4行2列的数组
print(arr1)
"""
[[[0 1]
  [2 3]
  [4 5]
  [6 7]]

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

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

arr2 = np.array([0, 1, 2, 3, 4, 5, 6, 7]).reshape(4, 2)
# arr2为1份4行2列的数组
print(arr2)
"""
[[0 1]
 [2 3]
 [4 5]
 [6 7]]
"""

print(arr1 + arr2)
"""
[[[ 0  2]
  [ 4  6]
  [ 8 10]
  [12 14]]

 [[ 0  2]
  [ 4  6]
  [ 8 10]
  [12 14]]

 [[ 0  2]
  [ 4  6]
  [ 8 10]
  [12 14]]]

"""

9.NumPy通用函数

9-1.元素级数字函数

abs、sqrt、square、exp、log、sin、cos、tan,maxinmum、minimum、all、any、inner、clip、round、trace、ceil、floor
import numpy as np

arr = np.array([-1, -2, -3, -4, 4, 9, 16])
print(arr)
# [-1 -2 -3 -4  4  9 16]

print(np.abs(arr))
# 绝对值 [ 1  2  3  4  4  9 16]

print(np.sqrt(arr[4:]))
# 开平方 [2. 3. 4.]

print(np.square(arr))
# 算平方 [  1   4   9  16  16  81 256]

print(np.min(arr))
# 最小值 -4

print(np.max(arr))
# 最大值 16

arr2 = np.array([666, -45, 0, 1, 1, 124, -999])
print(np.minimum(arr, arr2))
# 逐个对比arr和arr2的元素,列出小的值[  -1  -45   -3   -4    1    9 -999]
print(np.maximum(arr, arr2))
# 逐个对比arr和arr2的元素,列出大的值[666  -2   0   1   4 124  16]

9-2.where函数

where 函数,三个参数,条件为真时选择值的数组,条件为假时选择值的数组

import numpy as np

arr1 = np.array([1, 3, 5, 7, 9])
arr2 = np.array([2, 4, 6, 8, 10])
cond = np.array([True, False, True, True, False])
print(np.where(cond, arr1, arr2))
# [ 1  4  5  7 10]
"""
逐个去查看cond中的值,当cond的值为True时,对应位置取arr1中的值,当cond的值为False时,对应位置取arr2中的值
"""
arr3 = np.random.randint(0, 30, size=20)
# ⼩于25还是⾃身的值,⼤于25设置成NULL值
print(np.where(arr3 < 25, arr3, "NULL"))
# ['3' '19' '11' '18' '11' 'NULL' 'NULL' 'NULL' '20' 'NULL' '10' '23' '12'  'NULL' 'NULL' '15' '22' '5' '13' 'NULL']

9-3.排序方法

np中还提供了排序⽅法,排序⽅法是就地排序,即直接改变原数组

import numpy as np

# 方法1
arr1 = np.array([111, 3, 555, 7, 999])
arr1.sort()
print(np.sort(arr1))
# [  3   7 111 555 999]

# 方法2 - 通过排序后得到的索引
arr2 = np.array([111, 3, 555, 7, 999])
arr_index = arr2.argsort()
print(arr2[arr_index])
# [  3   7 111 555 999]

9-4.集合运算函数

import numpy as np

A = np.array([2, 4, 6, 8])
B = np.array([3, 4, 5, 6])

# 交集
print(np.intersect1d(A, B))
# [4 6] (A和B中都有的值)

# 并集
print(np.union1d(A, B))
# [2 3 4 5 6 8] (A或B中只要其中一个数组中有)

# 差集
print(np.setdiff1d(A, B))
# [2 8] (A中有并且B中没有的值)

9-5.数学和统计函数

min、max、mean、median、sum、std、var、cumsum、cumprod、argmin、argmax、
argwhere、cov、corrcoef
import numpy as np

arr1 = np.array([-666, 7, 2, 19, 23, 0, 888, 11, 6, 11])
# 计算最⼩值 -666
print(arr1.min())

# 计算最⼤值的索引 6
print(arr1.argmax())

# 返回⼤于20的元素的索引[[4][6]]
print(np.argwhere(arr1 > 20))

# 计算累加和
print(np.cumsum(arr1))
# [-666 -659 -657 -638 -615 -615  273  284  290  301]

arr2 = np.random.randint(0, 10, size=(4, 5))
print(arr2)
"""
[[3 5 0 1 1]
 [0 4 1 5 5]
 [2 9 3 9 4]
 [5 0 9 1 1]]
"""


# 计算列的平均值
print(arr2.mean(axis=0))
# [2.5  4.5  3.25 4.   2.75]

# 计算⾏的平均值
print(arr2.mean(axis=1))
# [2.  3.  5.4 3.2]

# 协⽅差矩阵
print(np.cov(arr2, rowvar=True))
"""
[[ 4.    0.    2.5  -3.75]
 [ 0.    5.5   5.75 -7.25]
 [ 2.5   5.75 11.3  -9.1 ]
 [-3.75 -7.25 -9.1  14.2 ]]
"""

# 相关性系数
print(np.corrcoef(arr2, rowvar=True))
"""
[[ 1.          0.          0.37185257 -0.49757334]
 [ 0.          1.          0.72936896 -0.82037514]
 [ 0.37185257  0.72936896  1.         -0.71838623]
 [-0.49757334 -0.82037514 -0.71838623  1.        ]]
"""

10.NumPy线性代数

​ 矩阵相乘最重要的方法是一般矩阵乘积。只有在第一个矩阵的列数(column)和第二个矩阵的行数(row)相同时才有意义 。一般单指矩阵乘积时,指的便是一般矩阵乘积。一个m×n的矩阵就是m×n个数排成m行n列的一个数阵。由于它把许多数据紧凑的集中到了一起,所以有时候可以简便地表示一些复杂的模型

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/64168.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Qt下多线程的四种使用方法总结及代码示例

文章目录前言一、继承QThread&#xff0c;重写run()函数二、继承QObject&#xff0c;使用moveToThread()函数三、继承QRunnable&#xff0c;重写run()函数&#xff0c;使用QThreadPool线程池四、使用QtConcurrent的run()函数五、示例代码六、下载链接总结前言 在之前的Qt开发工…

时间序列分析的基本流程(R语言版——实验篇)

数据处理 1.导入数据&#xff08;.csv&#xff09; 能导入绝大所数形式的格式文件 ex52<-read.table("C:\\Users\\33035\\Desktop\\习题5.2数据.txt",headerT,fileEncoding GBK) #header &#xff1a;T:表示留第一行 #fileEncoding:有中文时最好改为GBK 2.对数…

MySQL---DDL

MySQL简介DDL操作 文章目录MySQL简介DDL操作数据库分类关系型数据库&#xff08;SQL&#xff09;非关系型数据库&#xff08;NOSQL&#xff09;区别DBMSMySQL简介概念特点MySQL运行机制SQL通用语法结构化查询语言分类DDL操作数据库操作表查询创建数据类型数值类型字符串类型日期…

入行测试已经4年了 ,进阿里后迷茫了3个月,做完这个项目我决定离职....

转行测试 我是大专非计科&#xff0c;我转行之前从事的工作是商场管理&#xff0c;努力了4年左右的时间才做到楼层经理&#xff0c;但是工资太低并且事情太多&#xff0c;薪资才6K。 更多的是坚定了自己的想法&#xff0c;我要改变自己 恰好有几个大学同学在互联网公司工作&a…

微电网重构|基于群稀疏性的机会约束微电网重构(Matlab代码和Python代码实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清…

python算法对音频信号处理Sonification :Gauss-Seidel迭代算法

可以将44.1kHz单通道.wav文件中的一秒读取到长度为44100的数组&#xff08;称为b&#xff09;中。给定矩阵A&#xff0c;我们寻求系统Ax b的解。通过Gauss-Seidel的迭代&#xff0c;向量如果我们将b记录的录音&#xff0c;则将一些白噪声作为我们的初始猜测&#xff0c;并在每…

JVM常见面试题

目录 一、JVM内存划分 二、JVM类加载 1、什么是类加载 2、类加载的过程 2.1 加载 2.2 连接 2.3 初始化 3、何时触发类加载 4、双亲委派模型 4.1 什么是双亲委派模型 4.2 双亲委派模型的优点 三、JVM的垃圾回收机制 1、什么是GC 2、GC回收哪部分内存 3、判定垃圾…

# Monaco Editor 使用

Monaco Editor 使用 文章目录Monaco Editor 使用安装依赖版本问题vue2Vue3webpack-dev-servermonaco-editor-webpack-pluginVersion Matrix集成步骤Vue2 配置 monaco-editor-webpack-plugin 插件Vue3 vue.config.js测试页面实例属性说明支持的语言类型报错解决控制台报错效果图…

自适应滤波器更新算法-EP2

文章目录1、变步长 SC-MPNLMS 频域分块算法1.1 算法原理1.2 算法代码1.3 算法优缺点2、集成多种自适应滤波算法的回声消除器1.1 算法原理1.2 算法代码1.3算法优缺点1.4 算法自适应准则3、新的变步长的LMS自适应滤波算法3.1算法原理3.2算法代码3.3算法优缺点参考文献本文接上一篇…

钉钉小程序入门3—钉钉扫码登录PC端网站

第一部分、准备材料&#x1f332; 公网环境 老版钉钉扫码中必须要配置一个域名才可以调试&#xff0c;新版支持IP配置调了。我是手机打开热点&#xff0c;电脑连接热点进行调试的&#xff0c;比老版要方便了不少。 查看本机IP地址方法&#xff1a; 如果使用的Windows&#xff…

MySQL高可用复制管理工具 —— Orchestrator使用

Orchestrator介绍 Orchestrator&#xff08;orch&#xff09;&#xff1a;go编写的MySQL高可用性和复制拓扑管理工具&#xff0c;支持复制拓扑结构的调整&#xff0c;自动故障转移和手动主从切换等。后端数据库用MySQL或SQLite存储元数据&#xff0c;并提供Web界面展示MySQL复…

docker学习笔记2(狂神)

Docker的常用命令 然后我们来学我们最重要的镜像命令&#xff1a; docker images 查看所有本地的主机上的镜像 docker search搜索镜像&#xff1a; docker pull下载镜像&#xff1a; docker pull 镜像名[:tag] 指定版本下载&#xff1a; docker rmi删除镜像&#xff1a; 批量…

[附源码]Python计算机毕业设计Django市场摊位管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

m基于遗传优化的不同等级电动汽车充电站的选址方案matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 作为电动汽车的普及与推广&#xff0c;必要的基础配套服务设施、充电站的建设位置和选址规划对整体行业的发展起着重要的意义&#xff0c;本文中提出了一个不同等级电动汽车充电站的选址与求解算…

Zebec联合Visa推出实体借记卡持续利好生态,$ZBC表现强劲

Zebec生态从今年年初开始&#xff0c;持续的释放利好提振市场信心。此前&#xff0c;Zebec曾以 10 亿美元的完全稀释估值筹集了 850 万美元&#xff0c;该轮融资投资者包括 Circle Ventures、Shima 和 Resolute等知名 Web3 投资机构。这是 Zebec Protocol 继今年年初获得 2800 …

计算机系统基本概念

1.计算机的硬件结构 早期的计算机没有很复杂的图形功能&#xff0c;CPU的核心频率也不高&#xff0c;跟内存的频率一样&#xff0c;它们都是直接连接在同一个总线&#xff08;Bus&#xff09; 上的。由于IO设备诸如显示设备、键盘、软盘和磁盘等速度与CPU和内存相比还是慢很多…

QT:布局管理器消息盒子对话框

让组件在水平和垂直方向对齐 有三种常用布局管理器&#xff1a; 水平&#xff0c;QHBoxLayout 垂直&#xff0c;QVBoxLayout 网格&#xff0c;QGridLayout(使布局好的界面嵌套到主窗口) 1.让组件大小固定 修改属性&#xff1a;minimusize&#xff0c;maxmumsize 最小和最大组件…

使用setuptools构建python包

python包分发方式 源码包分发&#xff1a; 源码包安装过程是先解压&#xff0c;再编译。最后才安装&#xff0c;所以其是跨平台的&#xff0c;由于每次安装都需要进行编译&#xff0c;相对于二进制包安装方式来说安装速度较慢。 解压——编译——安装 源码包本质上是一个压缩…

CDGA|2023年数据治理发展前景预测步骤

CDGA|2023年数据治理发展前景预测步骤 数据治理发展前景预测&#xff0c;就是在数据治理市场调查获得的各种信息和资料的基础上&#xff0c;运用科学的预测技术和方法&#xff0c;对影响数据治理市场供求变化的诸因素进行调查研究&#xff0c;分析和预见数据治理发展趋势&…

《解构领域驱动设计》读书笔记

文章目录书籍信息开篇软件复杂度剖析复杂系统理解能力预测能力领域驱动设计概览基本概念控制软件复杂度领域驱动设计统一过程现存的不足领域驱动设计统一过程全局分析问题空间探索全局分析的 5W 模型高效沟通高效协作商业模式画布业务流程图服务蓝图用例图事件风暴学习循环价值…