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)