np.dot()函数

在 NumPy 中,np.dot() 函数用于计算两个数组的点积(内积)。其行为取决于输入数组的维度:

1. 一维数组(向量)的点积

计算两个向量的内积(标量结果)。

import numpy as np
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
result = np.dot(a, b)  # 1*4 + 2*5 + 3*6 = 32
print(result)  # 输出: 32

2. 二维数组(矩阵)的矩阵乘法

执行标准的矩阵乘法运算(行 × 列)。

A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
result = np.dot(A, B)
# 计算过程:
# [[1*5 + 2*7, 1*6 + 2*8],
#  [3*5 + 4*7, 3*6 + 4*8]]
print(result)
# 输出: 
# [[19 22]
#  [43 50]]

3. 高维数组的通用点积

对于 N 维数组,计算沿最后一个轴(a)和倒数第二个轴(b)的和积:

a = np.arange(3*4*5).reshape((3,4,5))
b = np.arange(3*5*2).reshape((3,5,2))
result = np.dot(a, b)
print(result.shape)  # 输出: (3, 4, 3, 2)
  • 规则
    dot(a, b)[i, j, k, l] = sum(a[i, j, :] * b[k, :, l])

注意事项

  1. 维度匹配

    • 一维数组:长度必须相同。
    • 二维数组:a 的列数 = b 的行数。
    • 高维数组:a 的最后一个维度长度 = b 的倒数第二个维度长度。
  2. 替代操作符

    • 矩阵乘法建议使用 @ 运算符(更直观):
      A @ B  # 等效于 np.dot(A, B)
      
    • 高维数组推荐使用 np.tensordotnp.einsum 控制求和轴。
  3. np.matmul 的区别

    • np.matmul 严格用于矩阵乘法,高维时按广播批次处理(结果形状为 (batch, m, n))。
    • np.dot 在高维时会产生更高维输出(如 (3,4,3,2))。

总结场景

场景推荐函数
向量内积np.dot(a, b)
矩阵乘法A @ B
高维数组指定轴求和np.tensordot

通过理解维度和轴的操作规则,可灵活应用 np.dot() 完成线性代数运算。

np.newaxis()函数

在 NumPy 中,np.newaxis 是一个非常有用的工具,用于增加数组的维度(添加新的轴)。它实际上是 None 的别名,用于在数组切片操作中创建新维度。

核心作用

  1. 将一维数组转换为二维的行向量或列向量
  2. 增加维度以支持广播操作
  3. 调整数组形状以匹配运算要求

基本用法

import numpy as np

arr = np.array([1, 2, 3])

# 转换为行向量 (1, 3)
row_vector = arr[np.newaxis, :]
print(row_vector.shape)  # 输出: (1, 3)
print(row_vector)        # [[1 2 3]]

# 转换为列向量 (3, 1)
col_vector = arr[:, np.newaxis]
print(col_vector.shape)  # 输出: (3, 1)
print(col_vector)        # [[1] [2] [3]]

实际应用场景

1. 矩阵乘法前的维度调整
A = np.array([1, 2])      # 形状 (2,)
B = np.array([[3, 4], [5, 6]])  # 形状 (2,2)

# 错误:维度不匹配
# result = A @ B  

# 解决方案:将A转为行向量 (1,2)
result = A[np.newaxis, :] @ B
print(result)  # 输出: [[13 16]] (1×2矩阵)
2. 广播机制配合
a = np.array([1, 2, 3])    # (3,)
b = np.array([10, 20])      # (2,)

# 通过增加维度使其可广播
result = a[:, np.newaxis] + b[np.newaxis, :]
"""
计算过程:
[[1]   + [[10, 20]]  => [[1+10, 1+20]
 [2]                   [2+10, 2+20]
 [3]]                  [3+10, 3+20]]
"""
print(result)
# 输出:
# [[11 21]
#  [12 22]
#  [13 23]]
3. 图像处理(增加通道维度)
# 假设灰度图像数据 (高度, 宽度)
grayscale = np.random.rand(256, 256)  

# 添加通道维度 (高度, 宽度, 通道)
rgb_ready = grayscale[:, :, np.newaxis]  
print(rgb_ready.shape)  # (256, 256, 1)

reshape 的对比:

# 等效操作:
arr[:, np.newaxis] == arr.reshape(-1, 1)

# 但np.newaxis更直观:
arr.reshape(1, -1, 1, 1) == arr[np.newaxis, :, np.newaxis, np.newaxis]

高级用法(多维度扩展)

data = np.array([10, 20])

# 创建3D张量 (2,1,1)
tensor = data[:, np.newaxis, np.newaxis]
print(tensor.shape)  # (2, 1, 1)
print(tensor)
# [[[10]]
#  [[20]]]

注意事项

  1. 不改变数据:只是添加长度为1的新维度
  2. 性能高效:不复制数据,是视图操作
  3. 别名特性np.newaxis is None 返回 True

np.newaxis 是处理 NumPy 维度问题的利器,尤其在数据预处理、广播操作和深度学习输入格式转换中非常常用。掌握它能显著提升数组操作的灵活性和效率。

更多推荐