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

如何实现一维numpy数组的tensor power(张量幂)函数?

实现一维NumPy数组的张量幂函数

这里有几种简便的实现方式,都能满足你的需求:

方法1:用reduce结合multiply.outer

利用np.multiply.outer的外积特性,通过functools.reduce累积计算n次外积,这是最简洁的实现方式之一:

import numpy as np
from functools import reduce

def tensor_pow(x: np.ndarray, n: int) -> np.ndarray:
    if n < 1:
        raise ValueError("n必须是正整数")
    return reduce(np.multiply.outer, [x] * n)

验证示例

y = tensor_pow(np.arange(3), 2)
print(y.shape)  # 输出 (3, 3)
print(y[1, 2] == 2)  # 输出 True

原理:np.multiply.outer(a, b)会生成a和b的外积数组,形状为a.shape + b.shape。多次调用后,就能得到n个维度的张量,每个元素对应位置的x元素乘积。


方法2:利用广播机制

通过将x变形为不同维度的视图,利用NumPy的广播特性实现元素级相乘:

import numpy as np

def tensor_pow(x: np.ndarray, n: int) -> np.ndarray:
    if n < 1:
        raise ValueError("n必须是正整数")
    # 为每个维度生成对应的广播视图
    views = []
    for i in range(n):
        # 构造形状:前i个维度为1,中间是x的长度,后n-i-1个维度为1
        shape = [1] * i + [-1] + [1] * (n - i - 1)
        views.append(x.reshape(shape))
    
    result = 1
    for v in views:
        result *= v
    return result

验证示例

y = tensor_pow(np.arange(3), 3)
print(y.shape)  # 输出 (3, 3, 3)
print(y[0, 1, 2] == 0 * 1 * 2)  # 输出 True

原理:每个视图在对应维度上保留x的原始长度,其余维度为1,广播机制会自动扩展这些维度,最终相乘得到所有元素的乘积组合。


方法3:用np.einsum实现

通过构造爱因斯坦求和的下标字符串,直接指定张量的乘积规则:

import numpy as np

def tensor_pow(x: np.ndarray, n: int) -> np.ndarray:
    if n < 1:
        raise ValueError("n必须是正整数")
    # 生成输入和输出的下标字符串,比如n=2时是"i,j->ij"
    input_indices = ','.join([chr(ord('a') + i) for i in range(n)])
    output_indices = ''.join([chr(ord('a') + i) for i in range(n)])
    return np.einsum(f"{input_indices}->{output_indices}", *([x] * n))

验证示例

y = tensor_pow(np.array([2, 3]), 2)
print(y)
# 输出:
# [[4 6]
#  [6 9]]

原理:np.einsum通过下标字符串定义张量的运算规则,这里我们让每个输入数组对应独立的下标,输出保留所有下标,本质就是计算所有元素的乘积组合。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 23:22:32