假设它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])。