python编程-数组和矩阵运算库numpy

NumPy 是一个强大的科学计算库,提供了许多操作和功能来处理数组和矩阵。以下是一些常见的 NumPy 操作,包括数组创建、切片、基本运算和一些其他有用的功能。

1. 数组创建

  • 创建一维数组

import numpy as np  
array_1d = np.array([1, 2, 3])
  • 创建二维数组(矩阵)

import numpy as np  

array_2d = np.array([[1, 2, 3], [4, 5, 6]])
  • 使用 arange 创建数组

import numpy as np  

array_range = np.arange(0, 10, 2)  # 0 到 10,步长为 2,可以看成等差数列

注意:起始参数包括开始不包括结尾 

  • 使用 linspace 创建数组

import numpy as np  
 
array_linspace = np.linspace(0, 1, 5)  # 生成 5 个均匀分布在 [0, 1] 的点
  • 生成特殊数组

import numpy as np  
array_1d = np.array([1, 2, 3])
array_2d = np.array([[1, 2, 3], [4, 5, 6]])

zeros_array = np.zeros((2, 3))  # 创建一个 2x3 的全零数组  
ones_array = np.ones((3, 2))    # 创建一个 3x2 的全一数组  
random_array = np.random.rand(2, 2)  # 创建一个 2x2 的随机数组

numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)

创建数组时,如array_1d = np.array([1, 2, 3])

array_1d是指向存储数据的指针变量。

数据类型dtype,描述在数组中的数据类型,表示用同样大小的内存块存储。

形状(shape)表示各维度大小

解析指针变量,看代码

import numpy as np
a = np.array([1, 2, 3])
b = a
a [0] = 42
print('a =', a)
print('b =', b)

输出:

a = [42 2 3]
b = [42 2 3]

为什么不是:

a = [42 2 3]
b = [1 2 3]

这是因为a和b指向同一块内存:

如何做到b拷贝a后,a和b互不影响?需要拷贝一块内存,使用所谓深拷贝:

import numpy as np
a = np.array([1, 2, 3])
b = a.copy()
print('a =', a)
print('b =', b)

2. 数组属性

检查数组维度

import numpy as np  

array_2d = np.array([[1, 2, 3], [4, 5, 6]])
array_2d.shape  # 返回数组的形状,例如 (2, 3)

数组的大小

import numpy as np  

array_2d = np.array([[1, 2, 3], [4, 5, 6]])
array_2d.size  # 返回数组元素的总数量

数组的数据类型

import numpy as np  

array_2d = np.array([[1, 2, 3], [4, 5, 6]])
print(array_2d.dtype) # 返回数组元素的数据类型


a = np.array([1, 2, 3], dtype='>i4')  # 创建一个大端序的32位整数数组
print(a.dtype)
b = a.dtype.newbyteorder('<')
print(b)

3. 数组切片和索引

  • 基本切片

import numpy as np

original_array = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [5, 7, 9]])
# 1:3 表示行索引为1行到3行,注意:索引从0开始,含首不含尾即包括第1行,不包括第3行。
# 0:2 同样道理,0列直2列,含0不含2
sliced_array = original_array[1:3, 0:2]
print(sliced_array)
  • 布尔索引

import numpy as np  

array_2d = np.array([[1, 2, 3], [4, 5, 6]])
boolean_index = array_2d[array_2d > 3]  # 返回数组中大于 3 的元素

4. 数学操作

数组的基本运算

import numpy as np  
array_1d = np.array([1, 2, 3])
array_2d = np.array([[1, 2, 3], [4, 5, 6]])

array_sum = array_1d + 10  # 每个元素加 10  
array_product = array_1d * 2  # 每个元素乘 2

数组间的运算

import numpy as np  

array_a = np.array([1, 2, 3])  
array_b = np.array([4, 5, 6])  
array_sum = array_a + array_b  # 数组元素逐位相加

归一化

import numpy as np  
array_1d = np.array([1, 2, 3])

normalized_array = (array_1d - np.mean(array_1d)) / np.std(array_1d)  # Z-score 归一化

5. 聚合和统计操作

计算和

import numpy as np  
array_1d = np.array([1, 2, 3])
 
total = np.sum(array_1d)  # 求和

均值

import numpy as np  
array_1d = np.array([1, 2, 3])
 
mean = np.mean(array_1d)  # 计算均值

最大值和最小值

import numpy as np  
array_1d = np.array([1, 2, 3])
array_2d = np.array([[1, 2, 3], [4, 5, 6]])

max_value = np.max(array_1d)  # 最大值  
min_value = np.min(array_1d)  # 最小值

6. 矩阵运算

矩阵乘法

import numpy as np  
 
matrix_a = np.array([[1, 2], [3, 4]])  
matrix_b = np.array([[5, 6], [7, 8]])  
matrix_product = np.dot(matrix_a, matrix_b)  # 矩阵乘法

转置

import numpy as np  
 
matrix_a = np.array([[1, 2], [3, 4]])  
matrix_b = np.array([[5, 6], [7, 8]])  
 
transposed_array = np.transpose(matrix_a)  # 矩阵转置

7. 数组拼接与分割

  • 拼接

import numpy as np  
 
matrix_a = np.array([[1, 2], [3, 4]])  
matrix_b = np.array([[5, 6], [7, 8]])  

concatenated_array = np.concatenate((array_a, array_b))  # 一维数组拼接  
stacked_array = np.vstack((array_a, array_b))  # 垂直堆叠
  • 分割

import numpy as np  
array_1d = np.array([1, 2, 3])
split_array = np.array_split(array_1d, 3)  # 将数组分割成 3 部分

8. 其他操作

  • 数组排序

import numpy as np  
array_1d = np.array([1, 2, 3])
sorted_array = np.sort(array_1d)  # 排序
  • 唯一值

numpy.ndarray.byteswap函数

import numpy as np  
array_1d = np.array([1, 2, 3])
unique_elements = np.unique(array_1d)  # 获取唯一值
import numpy as np
a = np.array([1, 2, 3], dtype='int16')
print("Before byteswap:", a)
a.byteswap(True)
print("After byteswap:", a)

这些是 NumPy 的一些基本操作和功能,它们在科学和工程计算中都是非常有用的。

快速傅里叶变换 (FFT)

  • 一维傅里叶变换
import numpy as np  

# 创建示例信号  
x = np.array([0, 1, 0, -1])  # 可以是任何信号  

# 进行一维快速傅里叶变换  
fft_result = np.fft.fft(x)  

# 输出结果  
print("FFT Result:", fft_result)
  • 一维反傅里叶变换
import numpy as np  

# 创建示例信号  
x = np.array([0, 1, 0, -1])  # 可以是任何信号  

# 进行一维快速傅里叶变换  
fft_result = np.fft.fft(x)  

# 输出结果  
print("FFT Result:", fft_result)

# 进行一维反傅里叶变换  
ifft_result = np.fft.ifft(fft_result)  

# 输出结果  
print("IFFT Result:", ifft_result)

2. 二维傅里叶变换

  • 对二维数组进行傅里叶变换(常用于图像处理):
import numpy as np

# 创建一个示例二维数组(例如图像)  
image = np.random.rand(256, 256)  

# 进行二维快速傅里叶变换  
fft_image = np.fft.fft2(image)  

# 输出结果的绝对值(幅度谱)  
magnitude_spectrum = np.abs(fft_image)
  • 二维反傅里叶变换
import numpy as np

# 创建一个示例二维数组(例如图像)  
image = np.random.rand(256, 256)  

# 进行二维快速傅里叶变换  
fft_image = np.fft.fft2(image)  

# 输出结果的绝对值(幅度谱)  
magnitude_spectrum = np.abs(fft_image)

# 进行二维反傅里叶变换  
ifft_image = np.fft.ifft2(fft_image)  

# 输出结果  
print("Recovered Image:", np.abs(ifft_image))
  • 计算频率轴:可以使用 np.fft.fftfreq 来计算傅里叶变换的频率轴。
import numpy as np

# 计算频率  
n = len(x)  
dt = 1.0  # 采样时间间隔  
freq = np.fft.fftfreq(n, d=dt)  
print("Frequency bins:", freq)
  • 移位频率谱:使用 np.fft.fftshift 来将零频率成分移到频谱中心。
import numpy as np

# 创建一个示例二维数组(例如图像)  
image = np.random.rand(256, 256)  

# 进行二维快速傅里叶变换  
fft_image = np.fft.fft2(image)  

# 移位频率谱  
shifted_image = np.fft.fftshift(fft_image)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

最好Tony

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值