You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解析numpy.vectorize中signature参数的语法功能及替代实现

NumPy vectorize 中 signature 参数解析与替代实现

一、各 signature 参数的语法与功能

signature 的核心是定义单个输入单元/输出单元的形状:括号内的字母代表维度长度变量,相同字母表示维度长度必须一致;逗号分隔多个输入/输出项,-> 明确区分输入与输出部分。

1. signature='(n),(n)->(),()'

  • 语法:输入为两个1维数组(长度均为 n),输出为两个标量(() 代表0维数组)。
  • 功能:指定向量化函数接收一对同长度的一维数组作为输入单元,计算后返回两个独立的标量结果。比如原函数接收两个一维数组,返回它们的求和值与均值,用该 signature 可直接批量处理这对数组,得到两个标量。

2. signature='(n),(m)->(k)'

  • 语法:输入为一个长度 n 的1维数组、一个长度 m 的1维数组,输出为一个长度 k 的1维数组(k 的长度由原函数逻辑决定,比如卷积操作的 n+m-1)。
  • 功能:允许向量化函数处理两个不同长度的一维输入,输出指定维度的一维结果。比如实现数组卷积、外积展平等操作时,用该 signature 可直接传入两个一维数组,得到符合长度要求的输出。

3. signature='(m,n)->(m,k),(k,n)'

  • 语法:输入为一个 m×n 的2维数组,输出为两个2维数组,形状分别为 m×k 和 k×n(k 通常取 min(m,n) 这类计算中的中间维度)。
  • 功能:指定向量化函数接收二维矩阵输入,返回两个不同形状的二维矩阵结果。比如矩阵奇异值分解(SVD)、自定义矩阵分解等场景,用该 signature 可直接传入矩阵,得到分解后的两个矩阵。

4. signature='(m,m)->(m,m)'

  • 语法:输入为一个 m×m 的二维方阵,输出为同形状的二维方阵。
  • 功能:限定向量化函数仅处理方阵输入,返回同尺寸的方阵结果。比如矩阵求逆、矩阵平方、特征值重构等操作,用该 signature 确保输入输出的方阵形状一致。

二、不使用 signature 的原生实现

numpy.vectorize 本质是语法糖,多数场景下无需依赖它,直接用 NumPy 原生向量化操作或自定义函数即可实现需求,效率更高:

1. 对应 (n),(n)->(),() 的实现

如果需求是对两个一维数组分别计算标量结果(比如求和、均值),直接调用 NumPy 原生函数或自定义函数:

import numpy as np

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

# 原生函数实现
sum_a, mean_b = np.sum(a), np.mean(b)

# 自定义函数实现
def compute(x, y):
    return np.max(x), np.min(y)
max_a, min_b = compute(a, b)

2. 对应 (n),(m)->(k) 的实现

针对两个一维数组的计算(比如卷积、外积展平),直接用 NumPy 原生函数:

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

# 卷积实现(k = n+m-1)
conv_result = np.convolve(a, b)

# 外积展平实现(k = n*m)
outer_flatten = np.outer(a, b).flatten()

3. 对应 (m,n)->(m,k),(k,n) 的实现

针对二维矩阵的分解操作,直接调用原生线性代数函数或自定义矩阵处理函数:

mat = np.random.rand(3, 5)

# SVD分解原生实现
U, _, Vt = np.linalg.svd(mat, full_matrices=False)  # U(3×3), Vt(3×5)

# 自定义分解函数
def custom_decompose(matrix):
    m, n = matrix.shape
    k = min(m, n)
    return np.random.rand(m, k), np.random.rand(k, n)
mat1, mat2 = custom_decompose(mat)

4. 对应 (m,m)->(m,m) 的实现

针对方阵的操作(求逆、矩阵平方),直接用 NumPy 原生操作:

mat = np.random.rand(3, 3)

# 矩阵求逆
inv_mat = np.linalg.inv(mat)

# 矩阵平方
mat_square = mat @ mat

内容的提问来源于stack exchange,提问作者Darkmoor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 00:35:17