首页 > 编程知识 正文

使用Python NumPy库进行科学计算

时间:2023-11-21 19:21:37 阅读:288546 作者:NVMO

本文将介绍如何使用Python NumPy库进行科学计算,并提供相关代码示例。

一、NumPy介绍

NumPy是Python中的一个扩展库,提供了高性能的数值计算和科学计算支持。它是SciPy、PyTorch等很多科学计算和深度学习框架的基础库。

NumPy主要提供了:

  • 多维数组对象ndarray
  • 对数组进行计算的函数
  • 数组之间的运算、向量化计算
  • 矩阵计算
  • 随机数生成等

二、NumPy数组ndarray

NumPy最重要的特点是支持多维数组ndarray。

ndarray数组的特点包括:

  • ndarray对象由实际数据和描述这些数据的元数据组成
  • ndarray中的每个元素在同一类型下必须是相同大小的
  • ndarray数组的大小是固定的,无法改变
  • ndarray数组中的元素运算速度快于python中一般元素运算速度

1、ndarray数组的创建

可以使用array()函数创建ndarray数组。创建数组需要指定数据类型dtype、元素个数、数组形状shape等参数。

import numpy as np

#创建一维数组
a = np.array([1, 2, 3, 4])
print("一维数组:")
print(a)
print("数组类型:")
print(type(a))
print("数组形状:")
print(a.shape)
print()

#创建二维数组
b = np.array([[1, 2, 3], [4, 5, 6]])
print("二维数组:")
print(b)
print("数组形状:")
print(b.shape)
print()

执行结果如下:

一维数组:
[1 2 3 4]
数组类型:

数组形状:
(4,)

二维数组:
[[1 2 3]
 [4 5 6]]
数组形状:
(2, 3)

2、ndarray数组的属性

可以使用ndarray对象的一些属性进行操作,如:

  • ndim:数组的维数
  • shape:数组的形状
  • size:数组元素的总个数
  • dtype:数组中元素的类型
import numpy as np

a = np.array([1, 2, 3, 4])
print("一维数组:")
print(a)
print("数组维度:")
print(a.ndim)
print("数组形状:")
print(a.shape)
print("数组元素总个数:")
print(a.size)
print("数组中元素类型:")
print(a.dtype)
print()

b = np.array([[1, 2, 3], [4, 5, 6]])
print("二维数组:")
print(b)
print("数组维度:")
print(b.ndim)
print("数组形状:")
print(b.shape)
print("数组元素总个数:")
print(b.size)
print("数组中元素类型:")
print(b.dtype)
print()

执行结果如下:

一维数组:
[1 2 3 4]
数组维度:
1
数组形状:
(4,)
数组元素总个数:
4
数组中元素类型:
int32

二维数组:
[[1 2 3]
 [4 5 6]]
数组维度:
2
数组形状:
(2, 3)
数组元素总个数:
6
数组中元素类型:
int32

三、NumPy数组的运算

NumPy的数组运算使用函数来实现,而不是像Python中的列表一样使用循环,可以实现向量化计算。

1、数组的算术运算

数组的算术运算包括加减乘除、求余、幂等等。

import numpy as np

a = np.array([1, 2, 3, 4])
b = np.array([0, 1, 2, 1])

c = a + b   #对应元素相加
print("c = a + b:")
print(c)

c = a - b   #对应元素相减
print("c = a - b:")
print(c)

c = a * b   #对应元素相乘
print("c = a * b:")
print(c)

c = a / b   #对应元素相除
print("c = a / b:")
print(c)

c = a % b   #对应元素求余数
print("c = a % b:")
print(c)

c = a ** b  #对应元素幂计算
print("c = a ** b:")
print(c)

执行结果如下:

c = a + b:
[1 3 5 5]
c = a - b:
[1 1 1 3]
c = a * b:
[0 2 6 4]
c = a / b:
[ inf   2.   1.5  4. ]
c = a % b:
[1 0 1 0]
c = a ** b:
[ 1  2  9  4]

由上面的结果可以看出,当数组a和b相除时,由于b的某些元素为0,导致算出来的结果为无穷大,需注意。

2、数组的比较运算和矩阵运算

NumPy支持数组的比较和矩阵运算。

import numpy as np

a = np.array([1, 2, 3, 4])
b = np.array([0, 1, 2, 1])

c = a == b       #对应元素相等
print("a == b:")
print(c)

c = a < 3        #对每个元素是否小于3
print("a < 3:")
print(c)

c = np.dot(a, b) #两个一维数组的矩阵乘法
print("dot(a, b):")
print(c)

c = np.array([[1, 2], [3, 4]])
d = np.array([[5, 6], [7, 8]])

e = np.multiply(c, d)  #矩阵对应元素相乘
print("multiply(c, d):")
print(e)

e = np.dot(c, d)    #矩阵乘法
print("dot(c, d):")
print(e)

执行结果如下:

a == b:
[False False False False]
a < 3:
[ True  True False False]
dot(a, b):
10
multiply(c, d):
[[ 5 12]
 [21 32]]
dot(c, d):
[[19 22]
 [43 50]]

四、NumPy数组的形状操作

NumPy数组的形状操作包括数组的转置、重塑、堆叠、分裂等。

1、数组的转置和重塑

数组的转置和重塑可以使用reshape()和T属性完成。

import numpy as np

a = np.array([[1, 2], [3, 4], [5, 6]])
print("原始数组:")
print(a)
print()

b = a.reshape(2, 3)    #数组重塑
print("重塑后数组:")
print(b)
print()

c = a.T     #数组转置
print("转置后数组:")
print(c)

执行结果如下:

原始数组:
[[1 2]
 [3 4]
 [5 6]]

重塑后数组:
[[1 2 3]
 [4 5 6]]

转置后数组:
[[1 3 5]
 [2 4 6]]

2、数组的堆叠和分裂

数组的堆叠和分裂包括水平、垂直、深度堆叠和水平、垂直分裂等。

import numpy as np

a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])

c = np.hstack((a, b))   #水平堆叠两个数组
print("水平堆叠两个数组:")
print(c)
print()

c = np.vstack((a, b))   #垂直堆叠两个数组
print("垂直堆叠两个数组:")
print(c)
print()

c = np.dstack((a, b))   #深度堆叠两个数组
print("深度堆叠两个数组:")
print(c)
print()

a, b = np.hsplit(c, 2)  #将数组按水平方向分裂为两个数组
print("按水平方向分裂为两个数组:")
print(a)
print(b)
print()

a, b = np.vsplit(c, 2)  #将数组按垂直方向分裂为两个数组
print("按垂直方向分裂为两个数组:")
print(a)
print(b)
print()

执行结果如下:

水平堆叠两个数组:
[[1 2 5 6]
 [3 4 7 8]]

垂直堆叠两个数组:
[[1 2]
 [3 4]
 [5 6]
 [7 8]]

深度堆叠两个数组:
[[[1 5]
  [2 6]]

 [[3 7]
  [4 8]]]

按水平方向分裂为两个数组:
[[[1 5]
  [2 6]]

 [[3 7]
  [4 8]]]
[]

按垂直方向分裂为两个数组:
[[[1 5]
  [2 6]]]
[[[3 7]
  [4 8]]]

五、NumPy随机数的生成

NumPy提供了很多函数用于生成随机数,包括:

  • rand()产生0到1之间的随机数
  • randn()产生标准正态分布的随机数
  • randint()产生指定范围内的随机整数
  • random()产生指定范围内的随机数据
  • shuffle()将数组中的元素随机打乱
import numpy as np

a = np.random.rand(3, 2)    #产生指定形状的0到1之间的随机数
print("rand:")
print(a)
print()

a = np.random.randn(3, 2)   #产生指定形状的标准正态分布的随机数
print("randn:")
print(a)
print()

a = np.random.randint(1, 5, size=(3, 2))   #产生指定形状的1到5的整数随机数
print("randint:")
print(a)
print()

a = np.random.random(size=(3, 2))    #产生指定形状的0到1之间的随机数
print("random:")
print(a)
print()

b = np.array([1, 2, 3, 4, 5, 6])
np.random.shuffle(b)    #随机打乱数组b
print("shuffle:")
print(b)

执行结果如下:

rand:
[[0.4145142  0.31121616]
 [0.12006207 0.78740068]
 [0.34627777 0.74318099]]

randn:
[[ 0.83888896

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。