如何从依赖于参数的 2d 数组定义 3d 数组?

Tam*_*mes 1 python numpy vectorization

我有一个二维矩阵

M = np.array([[0.5+t, 1, 1],
              [0.5, 0.5, t],
              [0.5, 1-t, 0.5]])
Run Code Online (Sandbox Code Playgroud)

我想为 $t$ 的几个值计算该矩阵的一些属性。我可以用 for 循环来做到这一点,但我想知道是否有一种方法可以不用循环来做到这一点。例如,创建一个 3d 数组,其中该数组的每个幻灯片都是一个 2d 数组,其中包含给定 t 的矩阵 M。

循环实现将是这样的。

import numpy as np

def M(t: float):
    return np.array([[0.5+t, 1, 1], [0.5, 0.5, t], [0.5, 1-t, 0.5]])

t_vec = np.linspace(0, 1, num=100)

norm = np.zeros_like(t_vec)
for i, t in enumerate(t_vec):
    matrix = M(t)
    norm[i] = np.linalg.norm(matrix)

Run Code Online (Sandbox Code Playgroud)

在本例中,我想计算矩阵的 2 范数并将所有值存储在数组中。

moz*_*way 5

我建议使用 2 个数组,一个用于 M,一个用于t

M = np.array([[0.5, 1.0, 1.0],
              [0.5, 0.5, 0.0],
              [0.5, 1.0, 0.5]])
t =  np.array([[1,  0, 0],
               [0,  0, 1],
               [0, -1, 0]])
Run Code Online (Sandbox Code Playgroud)

然后:

M+t

M+t*2

# etc.
Run Code Online (Sandbox Code Playgroud)

或者,以矢量方式:

t_vec = np.linspace(0, 1, num=100)

out = M+t*t_vec[:,None,None]

norm = np.linalg.norm(M, axis=(1, 2))
Run Code Online (Sandbox Code Playgroud)

  • 我认为使用矩阵/ndarrays而不是函数更有意义,并让 numpy 处理维度,它也会更有效;) (2认同)