当前位置: 首页 > news >正文

深度学习中常见的矩阵变换函数汇总(持续更新...)

1. 转置操作 (Transpose)

  • 概念:将矩阵的行和列互换
  • 应用场景:
    • 在卷积神经网络中转换特征图维度
    • 矩阵乘法运算前的维度调整
    • 数据预处理过程中的特征重排
原始矩阵 A = [[1, 2, 3],     转置后 A^T = [[1, 4],[4, 5, 6]]                  [2, 5],[3, 6]]
  • 代码:
import numpy as np
import tensorflow as tf
import torch
import pandas as pd
import scipy.sparse as sp# 创建示例矩阵
matrix = np.array([[1, 2, 3], [4, 5, 6]])
print("原始矩阵:")
print(matrix)
print("形状:", matrix.shape)# NumPy 实现
print("\n1. NumPy 转置:")
np_transpose = matrix.T
print(np_transpose)
print("形状:", np_transpose.shape)# 或者使用transpose()函数
np_transpose2 = np.transpose(matrix)
print(np_transpose2)# TensorFlow 实现
print("\n2. TensorFlow 转置:")
tf_matrix = tf.constant(matrix)
tf_transpose = tf.transpose(tf_matrix)
print(tf_transpose.numpy())# PyTorch 实现
print("\n3. PyTorch 转置:")
torch_matrix = torch.tensor(matrix)
torch_transpose = torch.transpose(torch_matrix, 0, 1)  # 交换维度0和1
print(torch_transpose)# 或者使用T属性
torch_transpose2 = torch_matrix.T
print(torch_transpose2)# pandas 实现
print("\n4. pandas 转置:")
df = pd.DataFrame(matrix)
pd_transpose = df.T
print(pd_transpose)# SciPy 实现 (稀疏矩阵)
print("\n5. SciPy 转置 (稀疏矩阵):")
sparse_matrix = sp.csr_matrix(matrix)
scipy_transpose = sparse_matrix.transpose()
print(scipy_transpose.toarray())

2. 矩阵乘法 (Matrix Multiplication)

  • 概念:两个矩阵相乘,要求第一个矩阵的列数等于第二个矩阵的行数
  • 应用场景:
    • Transformer 架构中的注意力计算和全连接层
    • 线性层的权重和输入相乘
    • 嵌入向量与查询向量的相似度计算
矩阵 A = [[1, 2],    矩阵 B = [[5, 6],     A×B = [[19, 22], [3, 4]]              [7, 8]]             [43, 50]]
  • 代码:
import numpy as np
import tensorflow as tf
import torch
import pandas as pd
import scipy.sparse as sp# 创建示例矩阵
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
print("矩阵A:")
print(A)
print("矩阵B:")
print(B)# NumPy 实现
print("\n1. NumPy 矩阵乘法:")
np_matmul = np.matmul(A, B)
print(np_matmul)# 使用 @ 运算符 (Python 3.5+)
np_matmul2 = A @ B
print(np_matmul2)# 使用 np.dot
np_dot = np.dot(A, B)
print(np_dot)# TensorFlow 实现
print("\n2. TensorFlow 矩阵乘法:")
tf_A = tf.constant(A)
tf_B = tf.constant(B)
tf_matmul = tf.matmul(tf_A, tf_B)
print(tf_matmul.numpy())# PyTorch 实现
print("\n3. PyTorch 矩阵乘法:")
torch_A = torch.tensor(A)
torch_B = torch.tensor(B)
torch_matmul = torch.matmul(torch_A, torch_B)
print(torch_matmul)# 使用 @ 运算符
torch_matmul2 = torch_A @ torch_B
print(torch_matmul2)# 使用 torch.mm (仅适用于2D矩阵)
torch_mm = torch.mm(torch_A, torch_B)
print(torch_mm)# pandas 实现 (通过NumPy转换)
print("\n4. pandas 矩阵乘法:")
df_A = pd.DataFrame(A)
df_B = pd.DataFrame(B)
pd_matmul = df_A.values @ df_B.values
print(pd_matmul)# SciPy 实现 (稀疏矩阵)
print("\n5. SciPy 矩阵乘法 (稀疏矩阵):")
sparse_A = sp.csr_matrix(A)
sparse_B = sp.csr_matrix(B)
scipy_matmul = sparse_A @ sparse_B
print(scipy_matmul.toarray())

3. 逐元素乘法 (Element-wise Multiplication / Hadamard Product)

  • 概念:两个相同形状的矩阵对应位置元素相乘
  • 应用场景:
    • 门控机制(如LSTM、GRU中的门控操作)
    • 特征选择和加权
    • 掩码操作(如注意力掩码)
矩阵 A = [[1, 2],    矩阵 B = [[5, 6],     A⊙B = [[5, 12], [3, 4]]              [7, 8]]            [21, 32]]
  • 代码
import numpy as np
import tensorflow as tf
import torch
import pandas as pd
import scipy.sparse as sp# 创建示例矩阵
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
print("矩阵A:")
print(A)
print("矩阵B:")
print(B)# NumPy 实现
print("\n1. NumPy 逐元素乘法:")
np_element_wise = A * B
print(np_element_wise)# 或者使用 np.multiply
np_multiply = np.multiply(A, B)
print(np_multiply)# TensorFlow 实现
print("\n2. TensorFlow 逐元素乘法:")
tf_A = tf.constant(A)
tf_B = tf.constant(B)
tf_element_wise = tf_A * tf_B
print(tf_element_wise.numpy())# 或者使用 tf.multiply
tf_multiply = tf.multiply(tf_A, tf_B)
print(tf_multiply.numpy())# PyTorch 实现
print("\n3. PyTorch 逐元素乘法:")
torch_A = torch.tensor(A)
torch_B = torch.tensor(B)
torch_element_wise = torch_A * torch_B
print(torch_element_wise)# 或者使用 torch.mul
torch_mul = torch.mul(torch_A, torch_B)
print(torch_mul)# pandas 实现
print("\n4. pandas 逐元素乘法:")
df_A = pd.DataFrame(A)
df_B = pd.DataFrame(B)
pd_element_wise = df_A * df_B
print(pd_element_wise)# SciPy 实现 (稀疏矩阵)
print("\n5. SciPy 逐元素乘法 (稀疏矩阵):")
sparse_A = sp.csr_matrix(A)
sparse_B = sp.csr_matrix(B)
scipy_element_wise = sparse_A.multiply(sparse_B)
print(scipy_element_wise.toarray())

4. 矩阵求逆 (Matrix Inversion)

  • 概念:求一个方阵的逆矩阵,满足 A × A⁻¹ = A⁻¹ × A = I(单位矩阵)
  • 应用场景:
    • 线性方程组求解
    • 数据白化处理
    • 协方差矩阵的处理
矩阵 A = [[4, 7],     A⁻¹ = [[-8/19, 7/19],[2, 6]]             [2/19, -4/19]]
  • 代码
import numpy as np
import tensorflow as tf
import torch
import pandas as pd
import scipy.linalg as spla# 创建示例方阵 (必须是可逆矩阵)
A = np.array([[4, 7], [2, 6]])
print("原始矩阵:")
print(A)# NumPy 实现
print("\n1. NumPy 矩阵求逆:")
np_inv = np.linalg.inv(A)
print(np_inv)
print("验证 A × A⁻¹ ≈ I:")
print(A @ np_inv)# TensorFlow 实现
print("\n2. TensorFlow 矩阵求逆:")
tf_A = tf.constant(A, dtype=tf.float32)
tf_inv = tf.linalg.inv(tf_A)
print(tf_inv.numpy())# PyTorch 实现
print("\n3. PyTorch 矩阵求逆:")
torch_A = torch.tensor(A, dtype=torch.float32)
torch_inv = torch.inverse(torch_A)
print(torch_inv)# pandas 实现 (通过NumPy)
print("\n4. pandas 矩阵求逆:")
df_A = pd.DataFrame(A)
pd_inv = pd.DataFrame(np.linalg.inv(df_A.values))
print(pd_inv)# SciPy 实现
print("\n5. SciPy 矩阵求逆:")
scipy_inv = spla.inv(A)
print(scipy_inv)

5. 矩阵分解 - SVD (奇异值分解)

  • 概念:将矩阵分解为 A = U × Σ × V^T,其中U和V是正交矩阵,Σ是对角矩阵
  • 应用场景:
    • 降维处理(如PCA的实现)
    • 推荐系统中的矩阵分解
    • 图像压缩和噪声过滤
    • 潜在语义分析(LSA)
矩阵 A = [[1, 2], [3, 4], [5, 6]] 分解为:
U = [[-0.2298,  0.8835,  0.4082],[-0.5247,  0.2408, -0.8165],[-0.8196, -0.4019,  0.4082]]Σ = [[9.5255,  0],[0,      0.5144],[0,      0]]V^T = [[-0.6196, -0.7849],[-0.7849,  0.6196]]
  • 代码
import numpy as np
import tensorflow as tf
import torch
import pandas as pd
import scipy.linalg as spla# 创建示例矩阵
A = np.array([[1, 2], [3, 4], [5, 6]])
print("原始矩阵:")
print(A)# NumPy 实现
print("\n1. NumPy SVD分解:")
U, s, Vh = np.linalg.svd(A, full_matrices=True)
print("U 矩阵:")
print(U)
print("奇异值:")
print(s)
print("V^T 矩阵:")
print(Vh)# 重构原始矩阵以验证
# 注意:由于s只包含奇异值,需要创建完整的Σ矩阵
S = np.zeros((A.shape[0], A.shape[1]))
S[:len(s), :len(s)] = np.diag(s)
A_reconstructed = U @ S @ Vh
print("重构矩阵:")
print(A_reconstructed)# TensorFlow 实现
print("\n2. TensorFlow SVD分解:")
tf_A = tf.constant(A, dtype=tf.float32)
s_tf, u_tf, v_tf = tf.linalg.svd(tf_A)
print("奇异值:")
print(s_tf.numpy())
print("U 矩阵:")
print(u_tf.numpy())
print("V 矩阵 (注意:这是V不是V^T):")
print(v_tf.numpy())# PyTorch 实现
print("\n3. PyTorch SVD分解:")
torch_A = torch.tensor(A, dtype=torch.float32)
U_torch, s_torch, V_torch = torch.svd(torch_A)
print("U 矩阵:")
print(U_torch)
print("奇异值:")
print(s_torch)
print("V 矩阵 (注意:这是V不是V^T):")
print(V_torch)# pandas 实现 (通过NumPy)
print("\n4. pandas SVD分解:")
df_A = pd.DataFrame(A)
U_pd, s_pd, Vh_pd = np.linalg.svd(df_A.values)
print("通过pandas数据,使用NumPy的SVD实现")# SciPy 实现
print("\n5. SciPy SVD分解:")
U_scipy, s_scipy, Vh_scipy = spla.svd(A)
print("U 矩阵:")
print(U_scipy)
print("奇异值:")
print(s_scipy)
print("V^T 矩阵:")
print(Vh_scipy)

6. 矩阵reshape操作

  • 概念:改变矩阵的形状,同时保持元素总数不变
  • 应用场景:
    • 神经网络层间维度变换(如展平操作)
    • 批处理数据的维度调整
    • 特征图转换(如在CNN和RNN之间)
矩阵 A = [[1, 2, 3],     reshape后 = [[1, 2],[4, 5, 6]]                  [3, 4],[5, 6]]
  • 代码
import numpy as np
import tensorflow as tf
import torch
import pandas as pd
import scipy.sparse as sp# 创建示例矩阵
A = np.array([[1, 2, 3], [4, 5, 6]])
print("原始矩阵:")
print(A)
print("形状:", A.shape)# NumPy 实现
print("\n1. NumPy reshape:")
np_reshaped = A.reshape(3, 2)
print(np_reshaped)
print("新形状:", np_reshaped.shape)# 使用-1参数自动计算维度
np_reshaped_auto = A.reshape(-1, 2)  # 行数自动计算
print("自动计算行数:")
print(np_reshaped_auto)# TensorFlow 实现
print("\n2. TensorFlow reshape:")
tf_A = tf.constant(A)
tf_reshaped = tf.reshape(tf_A, [3, 2])
print(tf_reshaped.numpy())# PyTorch 实现
print("\n3. PyTorch reshape:")
torch_A = torch.tensor(A)
torch_reshaped = torch_A.reshape(3, 2)
print(torch_reshaped)# 或使用view函数 (内存连续时)
torch_viewed = torch_A.view(3, 2)
print("使用view:")
print(torch_viewed)# pandas 实现 (通过NumPy)
print("\n4. pandas reshape:")
df_A = pd.DataFrame(A)
pd_reshaped = df_A.values.reshape(3, 2)
print(pd_reshaped)# 转回DataFrame
pd_reshaped_df = pd.DataFrame(pd_reshaped)
print(pd_reshaped_df)# SciPy 实现 (稀疏矩阵)
print("\n5. SciPy reshape (稀疏矩阵):")
sparse_A = sp.csr_matrix(A)
scipy_reshaped = sparse_A.reshape(3, 2)
print(scipy_reshaped.toarray())

7. 矩阵正则化 (Normalization)

  • 概念:对矩阵进行缩放,使其满足特定的范数约束
  • 应用场景:
    • 批归一化(Batch Normalization)
    • 权重正则化减少过拟合
    • 特征缩放提高训练效率
    • 梯度裁剪防止梯度爆炸
矩阵 A = [[1, 2], [3, 4]]L2行归一化后 = [[0.4472, 0.8944],[0.6, 0.8]]
  • 代码
import numpy as np
import tensorflow as tf
import torch
import pandas as pd
import scipy.sparse as sp
from sklearn.preprocessing import normalize# 创建示例矩阵
A = np.array([[1, 2], [3, 4]])
print("原始矩阵:")
print(A)# NumPy 实现 (L2行归一化)
print("\n1. NumPy 矩阵行归一化:")
# 手动计算行范数并归一化
row_norms = np.sqrt(np.sum(A**2, axis=1, keepdims=True))
np_normalized = A / row_norms
print(np_normalized)# 使用sklearn的normalize函数
np_normalized_sklearn = normalize(A, norm='l2', axis=1)
print("使用sklearn:")
print(np_normalized_sklearn)# TensorFlow 实现
print("\n2. TensorFlow 矩阵归一化:")
tf_A = tf.constant(A, dtype=tf.float32)
# L2范数归一化
tf_normalized = tf.nn.l2_normalize(tf_A, axis=1)
print(tf_normalized.numpy())# 或使用batch normalization (需要4D输入)
tf_batch_norm = tf.keras.layers.BatchNormalization()(tf.reshape(tf_A, [1, 2, 2, 1]))
print("Batch Normalization (要求4D输入):")
print(tf.reshape(tf_batch_norm, [2, 2]).numpy())# PyTorch 实现
print("\n3. PyTorch 矩阵归一化:")
torch_A = torch.tensor(A, dtype=torch.float32)
# L2范数归一化
torch_normalized = torch.nn.functional.normalize(torch_A, p=2, dim=1)
print(torch_normalized)# 或使用batch normalization
batch_norm = torch.nn.BatchNorm1d(2)
torch_batch_norm = batch_norm(torch_A)
print("Batch Normalization:")
print(torch_batch_norm)# pandas 实现 (通过NumPy或sklearn)
print("\n4. pandas 矩阵归一化:")
df_A = pd.DataFrame(A)
# 使用apply和NumPy
pd_normalized = df_A.apply(lambda x: x / np.sqrt(np.sum(x**2)), axis=1)
print(pd_normalized)# SciPy 实现 (稀疏矩阵)
print("\n5. SciPy 矩阵归一化 (稀疏矩阵):")
sparse_A = sp.csr_matrix(A)
# 计算行范数
row_norms = sp.linalg.norm(sparse_A, axis=1)
# 创建对角矩阵的逆
row_norms_inv = 1.0 / row_norms
diag_inv = sp.spdiags(row_norms_inv, 0, sparse_A.shape[0], sparse_A.shape[0])
# 矩阵乘法实现归一化
scipy_normalized = diag_inv @ sparse_A
print(scipy_normalized.toarray())

8. 矩阵拼接 (Concatenation)

  • 概念:沿指定轴将多个矩阵连接在一起
  • 应用场景:
    • 特征融合(多模态学习)
    • 批处理数据合并
    • 序列数据拼接(如在RNN中)
    • 层级特征组合(如在Skip Connection中)
矩阵 A = [[1, 2],    矩阵 B = [[5, 6], [3, 4]]              [7, 8]]横向拼接 = [[1, 2, 5, 6],[3, 4, 7, 8]]纵向拼接 = [[1, 2],[3, 4],[5, 6],[7, 8]]
  • 代码
import numpy as np
import tensorflow as tf
import torch
import pandas as pd
import scipy.sparse as sp# 创建示例矩阵
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
print("矩阵A:")
print(A)
print("矩阵B:")
print(B)# NumPy 实现
print("\n1. NumPy 矩阵拼接:")
# 横向拼接 (axis=1)
np_hconcat = np.concatenate([A, B], axis=1)
print("横向拼接 (axis=1):")
print(np_hconcat)# 纵向拼接 (axis=0)
np_vconcat = np.concatenate([A, B], axis=0)
print("纵向拼接 (axis=0):")
print(np_vconcat)# 或使用专用函数
np_hstack = np.hstack([A, B])  # 横向
np_vstack = np.vstack([A, B])  # 纵向
print("使用hstack:")
print(np_hstack)
print("使用vstack:")
print(np_vstack)# TensorFlow 实现
print("\n2. TensorFlow 矩阵拼接:")
tf_A = tf.constant(A)
tf_B = tf.constant(B)
# 横向拼接
tf_hconcat = tf.concat([tf_A, tf_B], axis=1)
print("横向拼接 (axis=1):")
print(tf_hconcat.numpy())# 纵向拼接
tf_vconcat = tf.concat([tf_A, tf_B], axis=0)
print("纵向拼接 (axis=0):")
print(tf_vconcat.numpy())# PyTorch 实现
print("\n3. PyTorch 矩阵拼接:")
torch_A = torch.tensor(A)
torch_B = torch.tensor(B)
# 横向拼接
torch_hconcat = torch.cat([torch_A, torch_B], dim=1)
print("横向拼接 (dim=1):")
print(torch_hconcat)# 纵向拼接
torch_vconcat = torch.cat([torch_A, torch_B], dim=0)
print("纵向拼接 (dim=0):")
print(torch_vconcat)# 或使用专用函数
torch_hstack = torch.hstack([torch_A, torch_B])  # 横向
torch_vstack = torch.vstack([torch_A, torch_B])  # 纵向
print("使用hstack:")
print(torch_hstack)
print("使用vstack:")
print(torch_vstack)# pandas 实现
print("\n4. pandas 矩阵拼接:")
df_A = pd.DataFrame(A)
df_B = pd.DataFrame(B)
# 横向拼接
pd_hconcat = pd.concat([df_A, df_B], axis=1)
print("横向拼接 (axis=1):")
print(pd_hconcat)# 纵向拼接
pd_vconcat = pd.concat([df_A, df_B], axis=0)
print("纵向拼接 (axis=0):")
print(pd_vconcat)# SciPy 实现 (稀疏矩阵)
print("\n5. SciPy 矩阵拼接 (稀疏矩阵):")
sparse_A = sp.csr_matrix(A)
sparse_B = sp.csr_matrix(B)
# 横向拼接
scipy_hconcat = sp.hstack([sparse_A, sparse_B])
print("横向拼接:")
print(scipy_hconcat.toarray())# 纵向拼接
scipy_vconcat = sp.vstack([sparse_A, sparse_B])
print("纵向拼接:")
print(scipy_vconcat.toarray())

9. 矩阵求和与归约操作

  • 概念:沿指定轴对矩阵进行求和或归约操作
  • 应用场景:
    • 池化操作(平均池化、最大池化)
    • 注意力权重的归一化
    • 批处理统计量的计算
    • 损失函数中的归约
矩阵 A = [[1, 2, 3],[4, 5, 6]]按行求和 = [6, 15]
按列求和 = [5, 7, 9]
全局求和 = 21
  • 代码

```python
import numpy as np
import tensorflow as tf
import torch
import pandas as pd
import scipy.sparse as sp# 创建示例矩阵
A = np.array([[1, 2, 3], [4, 5, 6]])
print("原始矩阵:")
print(A)# NumPy 实现
print("\n1. NumPy 矩阵归约操作:")
# 按行求和 (axis=1)
np_row_sum = np.sum(A, axis=1)
print("按行求和 (axis=1):")
print(np_row_sum)# 按列求和 (axis=0)
np_col_sum = np.sum(A, axis=0)
print("按列求和 (axis=0):")
print(np_col_sum)# 全局求和
np_total_sum = np.sum(A)
print("全局求和:")
print(np_total_sum)# 其他归约操作
np_max = np.max(A, axis=1)  # 按行取最大值
np_min = np.min(A, axis=0)  # 按列取最小值
np_mean = np.mean(A)        # 全局平均值
print("按行最大值:", np_max)
print("按列最小值:", np_min)
print("全局平均值:", np_mean)# TensorFlow 实现
print("\n2. TensorFlow 矩阵归约操作:")
tf_A = tf.constant(A)
# 按行求和
tf_row_sum = tf.reduce_sum(tf_A, axis=1)
print("按行求和 (axis=1):")
print(tf_row_sum.numpy())# 按列求和
tf_col_sum = tf.reduce_sum(tf_A, axis=0)
print("按列求和 (axis=0):")
print(tf_col_sum.numpy())# 全局求和
tf_total_sum = tf.reduce_sum(tf_A)
print("全局求和:")
print(tf_total_sum.numpy())# 其他归约操作
tf_max = tf.reduce_max(tf_A, axis=1)  # 按行取最大值
tf_min = tf.reduce_min(tf_A, axis=0)  # 按列取最小值
tf_mean = tf.reduce_mean(tf_A)        # 全局平均值
print("按行最大值:", tf_max.numpy())
print("按列最小值:", tf_min.numpy())
print("全局平均值:", tf_mean.numpy())# PyTorch 实现
print("\n3. PyTorch 矩阵归约操作:")
torch_A = torch.tensor(A)
# 按行求和
torch_row_sum = torch.sum(torch_A, dim=1)
print("按行求和 (dim=1):")
print(torch_row_sum)# 按列求和
torch_col_sum = torch.sum(torch_A, dim=0)
print("按列求和 (dim=0):")
print(torch_col_sum)# 全局求和
torch_total_sum = torch.sum(torch_A)
print("全局求和:")
print(torch_total_sum)# 其他归约操作
torch_max = torch.max(torch_A, dim=1).values  # 按行取最大值
torch_min = torch.min(torch_A, dim=0).values  # 按列取最小值
torch_mean = torch.mean(torch_A)              # 全局平均值
print("按行最大值:", torch_max)
print("按列最小值:", torch_min)
print("全局平均值:", torch_mean)# pandas 实现
print("\n4. pandas 矩阵归约操作:")
df_A = pd.DataFrame(A)
# 按行求和
pd_row_sum = df_A.sum(axis=1)
print("按行求和 (axis=1):")
print(pd_row_sum)# 按列求和
pd_col_sum = df_A.sum(axis=0)
print("按列求和 (axis=0):")
print(pd_col_sum)# 全局求和
pd_total_sum = df_A.values.sum()
print("全局求和:")
print(pd_total_sum)# 其他归约操作
pd_max = df_A.max(axis=1)  # 按行取最大值
pd_min = df_A.min(axis=0)  # 按列取最小值
pd_mean = df_A.mean().mean()  # 全局平均值
print("按行最大值:", pd_max.values)
print("按列最小值:", pd_min.values)
print("全局平均值:", pd_mean)# SciPy 实现 (稀疏矩阵)
print("\n5. SciPy 矩阵归约操作 (稀疏矩阵):")
sparse_A = sp.csr_matrix(A)
# 按行求和
scipy_row_sum = sparse_A.sum(axis=1)
print("按行求和 (axis=1):")
print(scipy_row_sum)# 按列求和
scipy_col_sum = sparse_A.sum(axis=0)
print("按列求和 (axis=0):")
print(scipy_col_sum)# 全局求和
scipy_total_sum = sparse_A.sum()
print("全局求和:")
print(scipy_total_sum)

10. 矩阵广播 (Broadcasting)

  • 概念:自动扩展较小的矩阵以匹配较大矩阵的形状,用于不同形状矩阵间的运算
  • 应用场景:
    • 批处理中的权重共享
    • 添加偏置项到特征矩阵
    • 批量数据缩放
    • 注意力机制的掩码应用
矩阵 A = [[1, 2, 3],    向量 b = [10, 20, 30][4, 5, 6]]A + b = [[11, 22, 33],[14, 25, 36]]
  • 代码
import numpy as np
import tensorflow as tf
import torch
import pandas as pd
import scipy.sparse as sp# 创建示例矩阵和向量
A = np.array([[1, 2, 3], [4, 5, 6]])
b = np.array([10, 20, 30])  # 形状为 (3,)
print("矩阵A:")
print(A)
print("向量b:")
print(b)# NumPy 实现
print("\n1. NumPy 广播操作:")
np_broadcast = A + b
print("A + b (广播):")
print(np_broadcast)# 另一个例子 - 列向量广播
c = np.array([[100], [200]])  # 形状为 (2, 1)
np_broadcast2 = A + c
print("A + c (列向量广播):")
print(np_broadcast2)# TensorFlow 实现
print("\n2. TensorFlow 广播操作:")
tf_A = tf.constant(A)
tf_b = tf.constant(b)
tf_broadcast = tf_A + tf_b
print("A + b (广播):")
print(tf_broadcast.numpy())# 另一个例子 - 列向量广播
tf_c = tf.constant([[100], [200]])
tf_broadcast2 = tf_A + tf_c
print("A + c (列向量广播):")
print(tf_broadcast2.numpy())# PyTorch 实现
print("\n3. PyTorch 广播操作:")
torch_A = torch.tensor(A)
torch_b = torch.tensor(b)
torch_broadcast = torch_A + torch_b
print("A + b (广播):")
print(torch_broadcast)# 另一个例子 - 列向量广播
torch_c = torch.tensor([[100], [200]])
torch_broadcast2 = torch_A + torch_c
print("A + c (列向量广播):")
print(torch_broadcast2)# 使用torch.broadcast_to显式广播
torch_b_expanded = torch.broadcast_to(torch_b, (2, 3))
print("显式广播b:")
print(torch_b_expanded)# pandas 实现
print("\n4. pandas 广播操作:")
df_A = pd.DataFrame(A)
# 对Series进行广播
s_b = pd.Series(b)
# 注意:pandas广播规则与NumPy稍有不同
# 使用numpy方式实现
pd_broadcast = df_A + s_b.values
print("使用numpy值进行广播:")
print(pd_broadcast)# 或使用numpy直接操作
pd_broadcast2 = df_A.values + b
print("直接使用numpy操作:")
print(pd_broadcast2)# SciPy 实现
print("\n5. SciPy 广播操作 (与NumPy类似):")
# 对于稀疏矩阵,广播操作不直接支持,需要转换处理
sparse_A = sp.csr_matrix(A)
# 必须先转换为密集矩阵,再进行广播,最后转回稀疏矩阵
scipy_broadcast = sp.csr_matrix(sparse_A.toarray() + b)
print("稀疏矩阵广播 (通过转换):")
print(scipy_broadcast.toarray())

11. 矩阵掩码操作 (Masking)

  • 概念:使用布尔矩阵选择性地保留或修改矩阵中的特定元素
  • 应用场景:
    • 注意力掩码(Transformer中的掩码机制)
    • 序列填充处理(处理变长序列)
    • 条件计算(选择性激活)
    • 梯度掩码(控制反向传播)
矩阵 A = [[1, 2, 3],       掩码 M = [[True, False, True],[4, 5, 6]]                [False, True, False]]应用掩码后 = [[1, 0, 3],[0, 5, 0]]
import numpy as np
import tensorflow as tf
import torch
import pandas as pd
import scipy.sparse as sp# 创建示例矩阵和掩码
A = np.array([[1, 2, 3], [4, 5, 6]])
mask = np.array([[True, False, True], [False, True, False]])
print("原始矩阵A:")
print(A)
print("掩码矩阵mask:")
print(mask)# NumPy 实现
print("\n1. NumPy 掩码操作:")
# 直接使用布尔索引
np_masked = A * mask  # 这会把False位置变为0
print("应用掩码 (A * mask):")
print(np_masked)# 设置特定值
np_masked_specific = np.where(mask, A, -1)  # 把False位置设为-1
print("应用掩码 (特定值替换):")
print(np_masked_specific)# 高级掩码 - 基于条件
condition_mask = A > 3
np_conditional = np.where(condition_mask, A, 0)
print("条件掩码 (A > 3):")
print(np_conditional)# TensorFlow 实现
print("\n2. TensorFlow 掩码操作:")
tf_A = tf.constant(A)
tf_mask = tf.constant(mask)
# 直接乘法掩码
tf_masked = tf_A * tf.cast(tf_mask, tf.int32)
print("应用掩码 (A * mask):")
print(tf_masked.numpy())# 使用where掩码
tf_masked_specific = tf.where(tf_mask, tf_A, -1)
print("应用掩码 (特定值替换):")
print(tf_masked_specific.numpy())# 条件掩码
tf_condition_mask = tf_A > 3
tf_conditional = tf.where(tf_condition_mask, tf_A, 0)
print("条件掩码 (A > 3):")
print(tf_conditional.numpy())# PyTorch 实现
print("\n3. PyTorch 掩码操作:")
torch_A = torch.tensor(A)
torch_mask = torch.tensor(mask)
# 直接乘法掩码
torch_masked = torch_A * torch_mask
print("应用掩码 (A * mask):")
print(torch_masked)# 使用where掩码
torch_masked_specific = torch.where(torch_mask, torch_A, torch.tensor(-1))
print("应用掩码 (特定值替换):")
print(torch_masked_specific)# 条件掩码
torch_condition_mask = torch_A > 3
torch_conditional = torch.where(torch_condition_mask, torch_A, torch.tensor(0))
print("条件掩码 (A > 3):")
print(torch_conditional)# 在注意力机制中常用的掩码示例
# 创建一个序列掩码(下三角矩阵)
seq_length = 4
causal_mask = torch.tril(torch.ones(seq_length, seq_length))
print("因果掩码 (下三角矩阵):")
print(causal_mask)# pandas 实现
print("\n4. pandas 掩码操作:")
df_A = pd.DataFrame(A)
pd_mask = pd.DataFrame(mask)
# 使用mask方法
pd_masked = df_A.mask(~pd_mask, 0)  # 注意pandas中mask用法与直觉相反
print("应用掩码 (A.mask(~mask)):")
print(pd_masked)# 使用where方法
pd_masked_specific = df_A.where(pd_mask, -1)
print("应用掩码 (特定值替换):")
print(pd_masked_specific)# 条件掩码
pd_condition_mask = df_A > 3
pd_conditional = df_A.where(pd_condition_mask, 0)
print("条件掩码 (A > 3):")
print(pd_conditional)# SciPy 实现 (稀疏矩阵)
print("\n5. SciPy 掩码操作 (稀疏矩阵):")
sparse_A = sp.csr_matrix(A)
# 稀疏矩阵的掩码操作相对复杂,一般通过转换处理
# 创建稀疏掩码
sparse_mask = sp.csr_matrix(mask)
# 元素乘法实现掩码
scipy_masked = sparse_A.multiply(sparse_mask)
print("应用掩码 (稀疏矩阵):")
print(scipy_masked.toarray())

12. 矩阵切片和索引

  • 概念:提取矩阵的子集或特定元素
  • 应用场景:
    • 特征选择
    • 批处理数据的提取
    • 注意力机制中的头部分割
    • 隐藏状态的选择性访问
矩阵 A = [[1, 2, 3, 4],[5, 6, 7, 8],[9, 10, 11, 12]]子矩阵 (1-2,1-3) = [[6, 7],[10, 11]]
  • 代码
import numpy as np
import tensorflow as tf
import torch
import pandas as pd
import scipy.sparse as sp# 创建示例矩阵
A = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
print("原始矩阵:")
print(A)# NumPy 实现
print("\n1. NumPy 切片和索引:")
# 基本切片 [行开始:行结束, 列开始:列结束]
np_slice = A[1:3, 1:3]
print("子矩阵 (行1-2, 列1-3):")
print(np_slice)# 单行/单列提取
np_row = A[1, :]  # 第二行
np_col = A[:, 2]  # 第三列
print("第二行:")
print(np_row)
print("第三列:")
print(np_col)# 高级索引
np_specific = A[[0, 2], [1, 3]]  # 获取 A[0,1] 和 A[2,3]
print("特定元素 (A[0,1] 和 A[2,3]):")
print(np_specific)# 布尔索引
np_bool_idx = A[A > 5]  # 获取所有大于5的元素
print("所有大于5的元素:")
print(np_bool_idx)# TensorFlow 实现
print("\n2. TensorFlow 切片和索引:")
tf_A = tf.constant(A)
# 基本切片
tf_slice = tf_A[1:3, 1:3]
print("子矩阵 (行1-2, 列1-3):")
print(tf_slice.numpy())# 单行/单列提取
tf_row = tf_A[1, :]  # 第二行
tf_col = tf_A[:, 2]  # 第三列
print("第二行:")
print(tf_row.numpy())
print("第三列:")
print(tf_col.numpy())# 高级索引
tf_specific = tf.gather_nd(tf_A, [[0, 1], [2, 3]])
print("特定元素 (A[0,1] 和 A[2,3]):")
print(tf_specific.numpy())# 布尔索引
tf_bool_mask = tf_A > 5
tf_bool_idx = tf.boolean_mask(tf_A, tf_bool_mask)
print("所有大于5的元素:")
print(tf_bool_idx.numpy())# PyTorch 实现
print("\n3. PyTorch 切片和索引:")
torch_A = torch.tensor(A)
# 基本切片
torch_slice = torch_A[1:3, 1:3]
print("子矩阵 (行1-2, 列1-3):")
print(torch_slice)# 单行/单列提取
torch_row = torch_A[1, :]  # 第二行
torch_col = torch_A[:, 2]  # 第三列
print("第二行:")
print(torch_row)
print("第三列:")
print(torch_col)# 高级索引
torch_specific = torch_A[[0, 2], [1, 3]]  # 获取 A[0,1] 和 A[2,3]
print("特定元素 (A[0,1] 和 A[2,3]):")
print(torch_specific)# 布尔索引
torch_bool_mask = torch_A > 5
torch_bool_idx = torch_A[torch_bool_mask]
print("所有大于5的元素:")
print(torch_bool_idx)# pandas 实现
print("\n4. pandas 切片和索引:")
df_A = pd.DataFrame(A)
# 基本切片 - 使用iloc
pd_slice = df_A.iloc[1:3, 1:3]
print("子矩阵 (行1-2, 列1-3):")
print(pd_slice)# 单行/单列提取
pd_row = df_A.iloc[1, :]  # 第二行
pd_col = df_A.iloc[:, 2]  # 第三列
print("第二行:")
print(pd_row)
print("第三列:")
print(pd_col)# 条件索引
pd_bool_idx = df_A[df_A > 5]
print("所有大于5的元素 (保留NaN):")
print(pd_bool_idx)# SciPy 实现 (稀疏矩阵)
print("\n5. SciPy 切片和索引 (稀疏矩阵):")
sparse_A = sp.csr_matrix(A)
# 基本切片
scipy_slice = sparse_A[1:3, 1:3]
print("子矩阵 (行1-2, 列1-3):")
print(scipy_slice.toarray())# 单行/单列提取
scipy_row = sparse_A[1, :].toarray()  # 第二行
scipy_col = sparse_A[:, 2].toarray()  # 第三列
print("第二行:")
print(scipy_row)
print("第三列:")
print(scipy_col)

13. 维度压缩与扩展 (Squeeze/Unsqueeze)

  • 概念
    • squeeze: 移除tensor中所有大小为1的维度
    • unsqueeze: 在指定位置添加一个大小为1的维度
  • 应用场景
    • 添加批处理维度进行批量操作
    • 在CNN中调整通道维度
    • 适配不同网络层之间的输入输出维度
    • 使用广播机制进行计算前的维度准备
原始tensor: shape=[2, 1, 3]       squeeze后: shape=[2, 3]
[[[ 1, 2, 3]],                    [[ 1, 2, 3],[[ 4, 5, 6]]]                     [ 4, 5, 6]]原始tensor: shape=[2, 3]          unsqueeze(1)后: shape=[2, 1, 3]
[[ 1, 2, 3],                      [[[ 1, 2, 3]],[ 4, 5, 6]]                       [[ 4, 5, 6]]]
  • 代码
import numpy as np
import tensorflow as tf
import torch
import pandas as pd# 创建示例数组/张量
x = np.array([[[1, 2, 3]], [[4, 5, 6]]])  # shape: (2, 1, 3)
print("原始数组:")
print(x)
print("形状:", x.shape)  # (2, 1, 3)# NumPy 实现
print("\n1. NumPy squeeze/expand_dims:")
# squeeze - 移除大小为1的维度
np_squeezed = np.squeeze(x, axis=1)
print("squeeze后:")
print(np_squeezed)
print("形状:", np_squeezed.shape)  # (2, 3)# expand_dims - 添加一个维度 (NumPy中对应unsqueeze)
y = np.array([[1, 2, 3], [4, 5, 6]])  # shape: (2, 3)
np_unsqueezed = np.expand_dims(y, axis=1)
print("\nexpand_dims后:")
print(np_unsqueezed)
print("形状:", np_unsqueezed.shape)  # (2, 1, 3)# TensorFlow 实现
print("\n2. TensorFlow squeeze/expand_dims:")
tf_x = tf.constant(x)
# squeeze
tf_squeezed = tf.squeeze(tf_x, axis=1)
print("squeeze后:")
print(tf_squeezed.numpy())
print("形状:", tf_squeezed.shape)  # (2, 3)# expand_dims
tf_y = tf.constant(y)
tf_unsqueezed = tf.expand_dims(tf_y, axis=1)
print("\nexpand_dims后:")
print(tf_unsqueezed.numpy())
print("形状:", tf_unsqueezed.shape)  # (2, 1, 3)# PyTorch 实现
print("\n3. PyTorch squeeze/unsqueeze:")
torch_x = torch.tensor(x)
# squeeze
torch_squeezed = torch_x.squeeze(1)
print("squeeze后:")
print(torch_squeezed)
print("形状:", torch_squeezed.size())  # torch.Size([2, 3])# unsqueeze
torch_y = torch.tensor(y)
torch_unsqueezed = torch_y.unsqueeze(1)
print("\nunsqueeze后:")
print(torch_unsqueezed)
print("形状:", torch_unsqueezed.size())  # torch.Size([2, 1, 3])# Pandas 没有直接对应的函数
print("\n4. Pandas 没有直接对应的squeeze/unsqueeze函数,需转换为NumPy处理")# SciPy 稀疏矩阵不直接支持维度操作
print("\n5. SciPy 稀疏矩阵不直接支持多维squeeze/unsqueeze,通常需转为密集数组处理")

14. 内存连续性 (Contiguous)

  • 概念:确保张量在内存中连续存储,某些操作(如转置、切片)会导致内存非连续
  • 应用场景
    • 执行需要连续内存的操作前调用
    • 视图操作后提高后续计算效率
    • CUDA操作优化
    • 与要求连续内存的外部库交互
# 视觉表示(简化):
非连续内存:  [1, 2, 3, 4, 5, 6]  <-- 内存中的实际存储↑  ↑  ↑             但逻辑访问顺序是: 1,4,2,5,3,6|  |  |
连续内存:    [1, 4, 2, 5, 3, 6]  <-- 重排后的内存存储
  • 代码
import numpy as np
import tensorflow as tf
import torch# 创建示例张量
matrix = np.array([[1, 2, 3], [4, 5, 6]])# PyTorch 实现 (最常用contiguous的框架)
print("1. PyTorch contiguous:")
torch_matrix = torch.tensor(matrix)
print("原始张量是否连续:", torch_matrix.is_contiguous())  # True# 进行转置操作,造成非连续内存
torch_transposed = torch_matrix.T
print("\n转置后是否连续:", torch_transposed.is_contiguous())  # False# 应用contiguous使其连续
torch_cont = torch_transposed.contiguous()
print("应用contiguous后是否连续:", torch_cont.is_contiguous())  # True
print("数据内容是否相同:", torch.all(torch_transposed == torch_cont).item())  # True# NumPy 实现
print("\n2. NumPy ascontiguousarray:")
np_transposed = matrix.T
print("转置后是否C连续:", np_transposed.flags.c_contiguous)  # False# 使用ascontiguousarray
np_cont = np.ascontiguousarray(np_transposed)
print("应用ascontiguousarray后是否C连续:", np_cont.flags.c_contiguous)  # True# TensorFlow 没有直接对应的函数
print("\n3. TensorFlow 没有直接对应的contiguous函数,但可使用tf.identity创建副本")
tf_matrix = tf.constant(matrix)
tf_transposed = tf.transpose(tf_matrix)
tf_copy = tf.identity(tf_transposed)  # 创建副本,可能重新排列内存# Pandas 没有直接对应的函数
print("\n4. Pandas 没有直接对应的contiguous函数")# SciPy 稀疏矩阵有特殊的内存表示
print("\n5. SciPy 稀疏矩阵使用特殊的内存表示方式,可通过格式转换重新排列数据")

15. 获取张量维度 (Size)

  • 概念:获取张量的维度信息(形状)
  • 应用场景
    • 调试和验证张量维度
    • 动态构建神经网络层
    • 数据处理前的维度检查
    • 动态调整批量大小
3D张量表示: shape=[2, 3, 4]
[[[值, 值, 值, 值],[值, 值, 值, 值],[值, 值, 值, 值]],[[值, 值, 值, 值],[值, 值, 值, 值],[值, 值, 值, 值]]]
  • 代码
import numpy as np
import tensorflow as tf
import torch
import pandas as pd
import scipy.sparse as sp# 创建示例多维数组
array = np.random.rand(2, 3, 4)# NumPy 实现
print("1. NumPy shape:")
print("shape属性:", array.shape)  # (2, 3, 4)
print("维度数量:", array.ndim)  # 3
print("元素总数:", array.size)  # 24# TensorFlow 实现
print("\n2. TensorFlow shape:")
tf_tensor = tf.constant(array)
print("shape属性:", tf_tensor.shape)  # (2, 3, 4)
print("维度数量:", tf.rank(tf_tensor))  # 3
print("元素总数:", tf.size(tf_tensor))  # 24# PyTorch 实现
print("\n3. PyTorch size:")
torch_tensor = torch.tensor(array)
print("size():", torch_tensor.size())  # torch.Size([2, 3, 4])
print("shape属性:", torch_tensor.shape)  # torch.Size([2, 3, 4])
print("指定维度大小 size(0):", torch_tensor.size(0))  # 2
print("维度数量:", torch_tensor.dim())  # 3# Pandas 实现
print("\n4. Pandas shape:")
df = pd.DataFrame(np.random.rand(3, 4))
print("shape属性:", df.shape)  # (3, 4)
print("行数:", df.shape[0])  # 3
print("列数:", df.shape[1])  # 4
print("元素总数:", df.size)  # 12# SciPy 实现
print("\n5. SciPy shape:")
sparse_matrix = sp.csr_matrix(np.random.rand(3, 4))
print("shape属性:", sparse_matrix.shape)  # (3, 4)
print("维度数量:", sparse_matrix.ndim)  # 2
print("非零元素数量:", sparse_matrix.nnz)

16. 张量重复 (Repeat)

  • 概念:沿指定维度重复张量的元素
  • 应用场景
    • 生成批量数据
    • 构建注意力掩码
    • 扩展特征向量以匹配其他张量
    • 图像处理中的上采样
原始矩阵: [[1, 2],   repeat(2,1) → [[1, 2, 1, 2],[3, 4]]                   [3, 4, 3, 4]]原始矩阵: [[1, 2],   repeat(2,2) → [[1, 2, 1, 2],[3, 4]]                   [3, 4, 3, 4],[1, 2, 1, 2],[3, 4, 3, 4]]
  • 代码
import numpy as np
import tensorflow as tf
import torch
import pandas as pd
import scipy.sparse as sp# 创建示例矩阵
matrix = np.array([[1, 2], [3, 4]])
print("原始矩阵:")
print(matrix)
print("形状:", matrix.shape)  # (2, 2)# NumPy 实现
print("\n1. NumPy tile/repeat:")
# np.tile - 类似PyTorch的repeat
np_tiled = np.tile(matrix, (2, 2))
print("np.tile((2, 2))后:")
print(np_tiled)
print("形状:", np_tiled.shape)  # (4, 4)# np.repeat - 沿特定轴重复元素
np_repeat_0 = np.repeat(matrix, 2, axis=0)
print("\nnp.repeat(2, axis=0)后:")
print(np_repeat_0)
print("形状:", np_repeat_0.shape)  # (4, 2)np_repeat_1 = np.repeat(matrix, 2, axis=1)
print("\nnp.repeat(2, axis=1)后:")
print(np_repeat_1)
print("形状:", np_repeat_1.shape)  # (2, 4)# TensorFlow 实现
print("\n2. TensorFlow tile/repeat:")
tf_matrix = tf.constant(matrix)
# tf.tile
tf_tiled = tf.tile(tf_matrix, [2, 2])
print("tf.tile([2, 2])后:")
print(tf_tiled.numpy())
print("形状:", tf_tiled.shape)  # (4, 4)# tf.repeat
tf_repeat_0 = tf.repeat(tf_matrix, 2, axis=0)
print("\ntf.repeat(2, axis=0)后:")
print(tf_repeat_0.numpy())
print("形状:", tf_repeat_0.shape)  # (4, 2)# PyTorch 实现
print("\n3. PyTorch repeat:")
torch_matrix = torch.tensor(matrix)
# repeat
torch_repeat = torch_matrix.repeat(2, 2)
print("torch.repeat(2, 2)后:")
print(torch_repeat)
print("形状:", torch_repeat.size())  # torch.Size([4, 4])# 使用expand和repeat组合
vector = torch.tensor([1, 2, 3])
vector_expanded = vector.unsqueeze(0)  # [1, 3]
vector_repeated = vector_expanded.repeat(3, 1)  # [3, 3]
print("\n向量经unsqueeze(0)和repeat(3, 1)后:")
print(vector_repeated)
print("形状:", vector_repeated.size())  # torch.Size([3, 3])# Pandas 实现
print("\n4. Pandas repeat:")
df = pd.DataFrame({'A': [1, 3], 'B': [2, 4]})
# 重复行
df_repeat_index = pd.DataFrame(np.repeat(df.values, 2, axis=0), columns=df.columns)
print("行重复2次:")
print(df_repeat_index)# SciPy 实现
print("\n5. SciPy 稀疏矩阵没有直接的repeat函数,可转换为密集数组后处理")

17. 上三角矩阵 (Triu)

  • 概念:提取或创建上三角矩阵,即只保留主对角线和主对角线以上的元素
  • 应用场景
    • 生成注意力掩码(自回归模型、Transformer解码器)
    • 矩阵分解
    • 线性方程组求解
    • 避免重复计算(如距离矩阵)
原始矩阵:        triu操作后:       triu(k=1)后:
[[1, 2, 3],      [[1, 2, 3],      [[0, 2, 3],[4, 5, 6],  →    [0, 5, 6],  →    [0, 0, 6],[7, 8, 9]]       [0, 0, 9]]       [0, 0, 0]]
  • 代码
import numpy as np
import tensorflow as tf
import torch
import pandas as pd
import scipy.sparse as sp# 创建示例矩阵
matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print("原始矩阵:")
print(matrix)# NumPy 实现
print("\n1. NumPy triu:")
np_triu = np.triu(matrix)
print("np.triu(matrix):")
print(np_triu)# 指定对角线偏移 (k=1, 主对角线上方)
np_triu_k1 = np.triu(matrix, k=1)
print("\nnp.triu(matrix, k=1):")
print(np_triu_k1)# TensorFlow 实现
print("\n2. TensorFlow 上三角:")
tf_matrix = tf.constant(matrix)
# tf 2.x中的band_part实现triu
tf_triu = tf.linalg.band_part(tf_matrix, 0, -1)  # 0表示下方带宽,-1表示上方带宽无限
print("tf上三角矩阵:")
print(tf_triu.numpy())# 主对角线上方 (k=1)
tf_triu_k1 = tf.linalg.band_part(tf_matrix, -1, -1) - tf.linalg.band_part(tf_matrix, 0, -1)
print("\ntf主对角线上方:")
print(tf_triu_k1.numpy())# PyTorch 实现
print("\n3. PyTorch triu:")
torch_matrix = torch.tensor(matrix)
torch_triu = torch.triu(torch_matrix)
print("torch.triu():")
print(torch_triu)# 指定对角线偏移
torch_triu_k1 = torch.triu(torch_matrix, diagonal=1)
print("\ntorch.triu(diagonal=1):")
print(torch_triu_k1)# Pandas - 没有直接对应函数
print("\n4. Pandas 没有直接的triu函数,可通过NumPy实现:")
df = pd.DataFrame(matrix)
df_triu = pd.DataFrame(np.triu(df.values))
print(df_triu)# SciPy 实现
print("\n5. SciPy triu:")
sparse_matrix = sp.csr_matrix(matrix)
scipy_triu = sp.triu(sparse_matrix)
print("sp.triu():")
print(scipy_triu.toarray())# 指定对角线偏移
scipy_triu_k1 = sp.triu(sparse_matrix, k=1)
print("\nsp.triu(k=1):")
print(scipy_triu_k1.toarray())

相关文章:

深度学习中常见的矩阵变换函数汇总(持续更新...)

1. 转置操作 (Transpose) 概念&#xff1a;将矩阵的行和列互换应用场景&#xff1a; 在卷积神经网络中转换特征图维度矩阵乘法运算前的维度调整数据预处理过程中的特征重排 原始矩阵 A [[1, 2, 3], 转置后 A^T [[1, 4],[4, 5, 6]] [2, 5],[3, 6]]代码…...

react+ts中函数组件父子通信方式

1. 父组件通过 Props 向子组件传递数据 这是最常见也是最基本的父子组件通信方式。父组件通过 props 将数据或回调函数传递给子组件。 示例代码&#xff1a; // 子组件接收来自父组件的数据 interface ChildProps {message: string; }const ChildComponent: React.FC<Chi…...

string--OJ3

链接: li1 #include <iostream> using namespace std;int main() {string a;getline(cin, a);cout << a.size() - a.find_last_of(" ")-1;{}}链接: li2 class Solution { public:bool isPalindrome(string s) {for (int i 0; i < s.size(); i){i…...

项目文档归档的最佳实践有哪些?

项目文档归档的最佳实践包括&#xff1a;明确归档标准与流程、使用集中式文档管理系统、实施严格的版本控制、定期审查与更新文档库。其中&#xff0c;明确归档标准与流程尤为关键&#xff0c;确保团队成员能统一理解并遵守文档管理规范。这包括明确文档命名规则、分类标准、归…...

C语言学习之字符函数和字符串函数

在C语言前面的内容中&#xff0c;我们学习到的库函数主要还是针对输入输出以及数字相关的内容&#xff0c;今天我们来学习一下有关于字符相关的函数&#xff0c;来对字符和字符串进行操作。 目录 字符分类函数 字符转换函数 以下的函数到strtok函数使用均需要包含头文件 st…...

自编码器(Autoencoder)

自编码器 是一种无监督学习的神经网络&#xff0c;主要用于数据的压缩和重构。它的核心思想是通过一个编码器将输入数据编码成一个低维表示&#xff08;编码&#xff09;&#xff0c;然后再通过一个解码器将这个低维表示重构回原始数据。自编码器的目标是让重构后的数据尽可能…...

黄金分割法(0.618 法)

黄金分割法简介 黄金分割法属于区间缩小法&#xff0c;通过逐步缩小包含极值的区间长度&#xff0c;逼近极值点。在每一次迭代中&#xff0c;使用黄金分割点 0.618 将区间分为两部分&#xff0c;比较这两点处的函数值&#xff0c;舍弃较差区间&#xff0c;从而逐渐逼近最优解。…...

电商双11美妆数据分析实验总结

数据分析方法与应用 数据分类与绘图 数据分类方法&#xff1a;通过指定列名和函数&#xff08;如SUM&#xff09;来分类数据&#xff0c;确保数据集中包含所需列&#xff0c;否则会报错。 嵌套柱形图应用&#xff1a;嵌套柱形图用于展示多层次分类的数据&#xff0c;如按店名和…...

TB6600HG是一款PWM(脉宽调制)斩波型单芯片双极性正弦波微步进电机驱动集成电路。

该驱动器支持电机的正向和反向旋转控制&#xff0c;并具有多种激励模式&#xff0c;包括2相、1-2相、W1-2相、2W1-2相和4W1-2相。 使用这款驱动器&#xff0c;只需时钟信号即可驱动2相双极性步进电机&#xff0c;且振动小、效率高。 主要特点&#xff1a; 单芯片双极性正弦波…...

java每日精进 5.07【框架之数据权限】

数据权限&#xff0c;实现指定用户可以操作指定范围的数据。 数据权限不支持指定用户只能查看数据的某些字段&#xff1b; 权限可以分成三类&#xff1a;功能权限、数据权限、字段权限。 目前可以使用数据脱敏实现一定程度的字段权限控制&#xff1b; 1.数据权限实现步骤 1.1插…...

2:点云处理—3D相机开发

1.包含相机库目录 1.include D:\中科\Ainstec3DViewer\AinstecCamSDK\AinstecCamSDK_CPP\include 2.lib D:\中科\Ainstec3DViewer\AinstecCamSDK\AinstecCamSDK_CPP\lib\win 3.release D:\中科\Ainstec3DViewer\AinstecCamSDK\AinstecCamSDK_CPP\bin 4.示例程序 D:\中科\A…...

MySQL 中的 MVCC 是什么?

MySQL 中的 MVCC&#xff08;Multi-Version Concurrency Control&#xff0c;多版本并发控制&#xff09; 是一种用于实现高并发读写操作的机制&#xff0c;它通过维护数据的多个版本来解决读写冲突&#xff0c;从而在保证事务隔离性的同时&#xff0c;减少锁的使用&#xff0c…...

JC/T 2187-2013 铝波纹芯复合铝板检测

铝波纹芯复合铝板是指以铝波纹板为芯材&#xff0c;双面粘接铝板的复合板材&#xff0c;如下图所示&#xff0c;铝波纹芯复合板具有轻质&#xff0c;环保&#xff0c;吸音&#xff0c;隔热&#xff0c;防火等性能&#xff0c;被广泛应用于机场&#xff0c;医院&#xff0c;体育…...

数字乡村综合管理与服务平台软件需求规格说明文档

数字乡村综合管理与服务平台 软件需求规格文档 文件版本&#xff1a;1.3 版本 文件状态&#xff1a;修改完成 文件作者&#xff1a;7组全体成员 完成日期&#xff1a;2025年5月7日 文章目录 a. 引言a.1 目的a.2 文档约定a.3 预期读者与涉众分析a.4 产品的范围a.5 参考文献…...

Linux常用命令33——sudo授权普通用户执行管理员命令

在使用Linux或macOS日常开发中&#xff0c;熟悉一些基本的命令有助于提高工作效率&#xff0c;sudo命令来自英文词组super user do的缩写&#xff0c;中文译为“超级用户才能干的事”&#xff0c;其功能是授权普通用户执行管理员命令。使用su命令变更用户身份虽然好用&#xff…...

Redis--哈希类型

目录 一、Hash 哈希 1.2 常用命令 1.2.1 HSET 1.2.2 HGET 1.2.3 HEXISTS 1.2.4 HDEL 1.2.5 HKEYS 1.2.6 HVALS 1.2.7 HGETALL 1.2.8 HMGET 1.2.9 HLEN 1.2.10 HSETNX 1.2.11 HINCRBY 1.2.12 HINCRBYFLOAT 1.3 内部编码 一、Hash 哈希 几乎所有的主流编程语言都提…...

数据结构——排序(万字解说)初阶数据结构完

目录 1.排序 2.实现常见的排序算法 2.1 直接插入排序 ​编辑 2.2 希尔排序 2.3 直接选择排序 2.4 堆排序 2.5 冒泡排序 2.6 快速排序 2.6.1 递归版本 2.6.1.1 hoare版本 2.6.1.2 挖坑法 2.6.1.3 lomuto前后指针 2.6.1.4 时间复杂度 2.6.2 非递归版本 2.7 归并排序…...

东方泵业,室外消火栓泵 2#故障灯亮,报警生响

东方泵业&#xff0c;室外消火栓泵 2#故障&#xff0c; 图纸上显示有一个热继电器&#xff0c;过热了&#xff0c;然后它不会自动复位&#xff0c;需要手动复位&#xff0c;手动点一下那个蓝色的按钮&#xff0c;然后警报就解除了...

vue3:十二、图形看板- 基础准备+首行列表项展示

文章主要实现了看板页面的搭建;将看板页面加入左侧菜单;首行列表项的实现 一、效果展示 展示四个数据列表,四个列表颜色各不相同,列表左侧有颜色边线(同标题颜色、图标颜色一致);展示的数字有一个从0到当前数据逐渐增长的一个动画效果 二、图形看板的准备工作 1、创建视…...

基于开源链动2+1模式AI智能名片S2B2C商城小程序的分销价格管控机制研究

摘要&#xff1a;本文聚焦开源链动21模式AI智能名片S2B2C商城小程序在分销体系中的价格管控机制&#xff0c;通过解析其技术架构与商业模式&#xff0c;揭示平台如何通过"去中心化裂变中心化管控"双轨机制实现价格统一。研究显示&#xff0c;该模式通过区块链存证技术…...

指定Docker镜像源,使用阿里云加速异常解决

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo异常贴图 yum-config-manager&#xff1a;找不到命令 因为系统默认没有安装这个命令&#xff0c;这个命令在yum-utils 包里&#xff0c;可以通过命令yum -y install yum-util…...

java基础-数组

1.数组的声明和初始化&#xff1a; &#xff08;1&#xff09;静态初始化&#xff1a; import java.util.Arrays;public class Main {public static void main(String[] args) {int[] ids {1,2,3,4,5};System.out.println(Arrays.toString(ids));} } &#xff08;2&#xf…...

CSS手动布局

CSS支持单独设置某个元素的布局&#xff0c;最主要的属性是 position &#xff0c;它有以下几个值&#xff1a; static静态位置&#xff08;默认值&#xff09;。元素采用正常流布局&#xff0c;此时元素的位置偏移属性&#xff08; top 、 right 、 bottom 、 left 和 z-inde…...

什么是智能合约?区块链上的自动化契约

智能合约是运行在区块链上的计算机程序或交易协议。与传统的纸质合同不同&#xff0c;智能合约将合同条款直接编码到程序中&#xff0c;并在满足预设条件时自动执行。它们旨在实现无需第三方介入的可信交易&#xff0c;具有自动化、透明、不可篡改和高效等特点。 智能合约的起…...

webRtc之指定摄像头设备绿屏问题

摘要&#xff1a;最近发现&#xff0c;在使用navigator.mediaDevices.getUserMedia({ deviceId: ‘xxx’}),指定设备的时候&#xff0c;video播放总是绿屏&#xff0c;发现关闭浏览器硬件加速不会出现&#xff0c;但显然这不是一个最好的方案; 播放后张这样 修复后 上代码 指定…...

正则表达式非捕获分组?:

一个使用 Java 正则表达式的具体例子&#xff0c;展示了 (ab) 和 (?:ab) 的不同&#xff1a; 示例 1&#xff1a;使用 (ab)&#xff08;捕获分组&#xff09; import java.util.regex.*; public class RegexExample { public static void main(String[] args) { …...

Linux系统Shell脚本之shell数组、正则表达式、及AWK

目录 一.shell数组 1.数组分类 2.定义数组的方法 二.正则表达式 1. 元字符 2.表示次数 3.位置锚定 4.分组 5.扩展正则表达式 三.文本三剑客之AWK 1.awk 2.使用格式 3、处理动作 4.选项 5.处理模式 6.awk常见的内置变量 7.if条件判断 一.shell数组 1.数组分类 …...

在 ESP-IDF 中使用 .a 静态库调用

1. 准备静态库文件 将你的 .a 文件&#xff08;如 libmylib.a&#xff09;放置在工程目录中&#xff0c;推荐放在 components 子目录下&#xff1a; your_project/ ├── CMakeLists.txt ├── main/ └── components/└── my_lib/├── include/ # 头文件│ …...

​​大疆无人机“指点飞行模式”​​(TapFly)

在大疆无人机的功能中&#xff0c;​​“指点飞行模式”​​&#xff08;TapFly&#xff09;是一种​​通过点击屏幕目标点&#xff0c;让无人机自动规划路径并飞向指定位置​​的智能飞行模式。用户无需手动操控摇杆&#xff0c;只需在 App 地图或实时画面上点击目标位置&…...

力扣 : 781. 森林中的兔子

781. 森林中的兔子 - 力扣&#xff08;LeetCode&#xff09; 同一个数字的可以分为一组 &#xff0c; 3就是有3个人和我自己相同 也就是4个人&#xff0c;所以相同的数字可以分为 / (num1) 向上取整 class Solution { public:int numRabbits(vector<int>& answer…...

LVS中的DR模式,直接路由模式

DR模式工作原理介绍 请求经过调度器&#xff0c;响应由real server 直接响应给客户端。 如上图所示&#xff0c;real server想要正常访问互联网&#xff0c;后端的real server的网关就得写网络中真实的网关。 DR模式的核心要素&#xff1a;【重点】 1.请求经过调度器&…...

iTwin 数据报表(只是简单的原型不代表实现)

大概想法是 前端从schema和class中选中感兴趣的property内容生成ecsql语句传递给后端后端解析ecsql并提供公开接口给各个分析工具&#xff0c;如excel&#xff0c;poewerBI等&#xff08;Odata或者直接选择来自网站&#xff09;再由分析工具做进一步的处 还未想好的点 如何存…...

【无标题】如何在sheel中运行Spark

启动hdfs集群&#xff0c;打开hadoop100:9870&#xff0c;在wcinput目录下上传一个包含很多个单词的文本文件。 启动之后在spark-shell中写代码。 // 读取文件&#xff0c;得到RDD val rdd1 sc.textFile("hdfs://hadoop100:8020/wcinput/words.txt") // 将单词进行…...

Spark 处理过程转换:算子与行动算子详解

在大数据处理领域&#xff0c;Apache Spark 凭借其强大的分布式计算能力脱颖而出&#xff0c;成为处理海量数据的利器。而 Spark 的核心处理过程&#xff0c;主要通过转换算子和行动算子来实现。本文将深入探讨 Spark 中的转换算子和行动算子&#xff0c;帮助读者更好地理解和应…...

Docker编排工具---Compose的概述及使用

目录 一、Compose工具的概述 二、Compose的常用命令 1、列出容器 2、查看访问日志 3、输出绑定的公共端口 4、重新构建服务 5、启动服务 6、停止服务 7、删除已停止服务的容器 8、创建和启动容器 9、在运行的容器中执行命令 10、指定一个服务启动容器的个数 11、其…...

Matlab实现绘制任意自由曲线

Matlab实现绘制任意自由曲线&#xff0c;实现Photoshop中的钢笔路径功能&#xff0c;用光顺连接的B样条/贝塞尔曲线实现&#xff0c;鼠标点击生成控制点&#xff0c;拖动形成任意曲线。 可描绘多路径&#xff0c;也可旋转、平移、缩放。经调试可用。 ByangtiaoSculpt/Byangti…...

如何保证Kafka生产者的消息顺序性? (单分区内有序,需确保同一Key的消息发送到同一分区)

Kafka 生产者消息顺序性保障方案 1. 核心实现原理 消息顺序性保障公式&#xff1a; 同一 Key → 同一 Partition → 严格顺序写入2. 关键配置参数 Properties props new Properties(); props.put("acks", "all"); // 确保消息持久化 props.put("ma…...

[D1,2] 贪心刷题

文章目录 摆动序列最大子数组合买卖股票跳跃游戏跳跃2 摆动序列 不像是贪心&#xff0c;只要抓住摆动这个点&#xff0c;前一个上升&#xff0c;那下一个就要下降&#xff0c;记录上一次的状态为1的话&#xff0c;那下一次就要更新为-1&#xff0c;如果上一次为1&#xff0c;这…...

springboot使用阿里云OSS实现文件上传

在Spring Boot中集成阿里云OSS&#xff08;对象存储服务&#xff09;可以通过以下步骤实现&#xff1a; 添加Maven依赖 在pom.xml中添加阿里云OSS SDK依赖&#xff1a; <dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss<…...

nginx之proxy_redirect应用

一、功能说明 proxy_redirect 是 Nginx 反向代理中用于修改后端返回的响应头中 Location 和 Refresh 字段的核心指令&#xff0c;主要解决以下问题&#xff1a;协议/地址透传错误&#xff1a;当后端返回的 Location 包含内部 IP、HTTP 协议或非标准端口时&#xff0c;需修正为…...

FAISS(Facebook AI Similarity Search)

First steps with Faiss for k-nearest neighbor search in large search spaces - Davide’s GitHub pages FAISS&#xff08;Facebook AI Similarity Search&#xff09;是由Meta&#xff08;原Facebook&#xff09;AI团队开发的高效相似性搜索库&#xff0c;主要用于处理大规…...

创建虚拟服务时实现持久连接。

在调度器中配置虚拟服务&#xff0c;实现持久性连接&#xff0c;解决会话保持问题。 -p 【timeout】 -p 300 这5分钟之内调度器会把来自同一个客户端的请求转发到同一个后端服务器。【不管使用的调度算法是什么。】【称为持久性连接。】 作用&#xff1a;将客户端一段时间…...

RabbitMQ中Exchange交换器的类型

在RabbitMQ中&#xff0c;Exchange&#xff08;交换器&#xff09;是消息路由的核心组件&#xff0c;它接收生产者发送的消息&#xff0c;并根据不同的规则将消息转发到一个或多个队列。 RabbitMQ主要支持以下几种类型的交换器&#xff1a; 1. Direct Exchange&#xff08;直连…...

JavaSE核心知识点01基础语法01-05(字符串)

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 JavaSE核心知识点01基础语法01-05&#xff0…...

Vue 项目中二维码生成功能全解析

Vue 项目中二维码生成功能全解析 在信息快速传递的时代&#xff0c;二维码以其简洁高效的特点&#xff0c;成为数据交互的重要媒介。无论是用于支付、信息分享&#xff0c;还是活动参与&#xff0c;二维码都扮演着关键角色。在 Vue 项目开发中&#xff0c;如何实现二维码生成功…...

【AWS+Wordpress】将本地 WordPress 网站部署到AWS

前言 自学笔记&#xff0c;解决问题为主&#xff0c;亲测有效&#xff0c;欢迎补充。 本地开发机&#xff1a;macOS&#xff08;Sequoia 15.0.1&#xff09; 服务器&#xff1a;AWS EC2&#xff08;Amazon Linux 2023&#xff09; 目标&#xff1a;从本地迁移 WordPress 到云…...

性能优化-初识(C++)

性能优化-初识 一、内联与优化&#xff08;Inlining and Optimization&#xff09;什么是内联&#xff08;inline&#xff09;&#xff1f;使用方式&#xff1a;适用场景&#xff1a;注意事项&#xff1a; 二、缓存友好设计&#xff08;Cache-Friendly Design&#xff09;原理简…...

[人机交互]交互设计过程

*一.设计 1.1什么是设计 设计是一项创新活动&#xff0c;旨在为用户提供可用的产品 –交互设计是“设计交互式产品、以支持人们的生活和工作” 1.2设计包含的四个活动 – 识别用户的需要&#xff08; needs &#xff09;并建立需求&#xff08; requirements &#xff09; …...

密码学基石:哈希、对称/非对称加密与HTTPS实践详解

密码学是现代信息安全的基石&#xff0c;它提供了一系列强大的数学工具和技术&#xff0c;用于保护数据的机密性、完整性和真实性&#xff0c;并确保通信双方的身份可被认证。在纷繁复杂的网络世界中&#xff0c;无论是安全的网页浏览 (HTTPS)、安全的软件更新、还是用户密码的…...

WebRTC通信原理与流程

1、服务器与协议相关 1.1 STUN服务器 图1.1.1 STUN服务器在通信中的位置图 1.1.1 STUN服务简介 STUN&#xff08;Session Traversal Utilities for NAT&#xff0c;NAT会话穿越应用程序&#xff09;是一种网络协议&#xff0c;它允许位于NAT&#xff08;或多重 NAT&#xff09;…...