假设它f
是一个参数的函数,它的输出是一个n维 ( m 1 × m 2 ... × m n ) 数组,它B
是一个长度为k的向量,其元素都是 的有效参数f
。
我正在寻找一个方便的,更重要的是,“形状不可知”的 MATLAB 表达式(或配方),用于生成 ( n +1) 维 ( m 1 × m 2 ×…× m n × k ) 数组“堆叠” k n维数组
f(b)
,其中参数b
范围超过B
。
为此numpy
,我将使用如下表达式:
C = concatenate([f(b)[..., None] for b in B], -1)
如果它有任何用处,我将在下面解压缩这个 numpy 表达式(参见附录),但我现在要强调的特征是它完全不知道 和 的形状/ f(b)
大小 B
。对于我想到的应用程序类型,编写这种“与形状无关”的代码的能力至关重要。(我强调这一点,因为我在进行这种操作时遇到的许多 MATLAB 代码显然不是“与形状无关的”,而且我不知道如何做到这一点。)
附录
一般来说,如果A
是一个 numpy 数组,那么表达式A[..., None]
可以被认为是“重塑” A
,以便它获得一个额外的、微不足道的维度。因此,如果f(b)
是一个n维 ( m 1 × m 2 … × m n ) 数组,则f(b)[..., None]
是对应的 ( n +1) 维 ( m 1 × m 2 ×…× m n × 1) 数组。(添加这个微不足道的维度的原因将在下面变得清楚。)
有了这个澄清,第一个参数的含义concatenate
,即:
[f(b)[..., None] for b in B]
不太难破译。它是一个标准的 Python“列表推导”,它计算为k ( n +1) 维 ( m 1 × m 2 ×…× m n × 1) 数组的序列f(b)[..., None]
,因为参数b
范围在 vector 上B
。
to的第二个参数concatenate
是要执行连接的“轴”,表示为要连接的数组的相应维度的索引。end
在这种情况下,索引 -1 与MATLAB中的关键字所起的作用相同。因此,表达式
concatenate([f(b)[..., None] for b in B], -1)
说“f(b)[..., None]
沿它们的最后一个维度连接数组”。正是为了提供这个“最后一个维度”来连接,所以有必要对f(b)
数组进行整形(例如,使用f(b)[..., None]
)。