如何让np.vectorize直接操作数组最后轴以避免频繁转置?
问题解答
np.vectorize 的 signature 参数是匹配输入数组的最后几个维度,它没有直接参数可以指定遍历特定轴,遍历逻辑完全由输入数组的维度顺序和 signature 定义共同决定。
你的场景中,需要对 a(形状(100,5))的每一列(维度100)和 b(形状(20,5))的每一列(维度20)应用函数 f,但这两个核心维度都处于数组的第一个轴。而 np.vectorize 只会将数组的最后几个维度识别为 signature 中定义的核心维度,因此必须通过转置(或 np.moveaxis)把核心维度移到数组末尾,让需要遍历的列维度(形状5)处于数组前端,才能让 signature 正确匹配。
简单来说:目前没有办法绕开维度调整(转置或轴移动)直接让 np.vectorize 作用于 a 和 b 的最后一个轴,这是由它的设计逻辑决定的。
如果你的函数 f 本身可以用原生 numpy 操作实现(避免 Python 循环),可以考虑用广播替代 np.vectorize:比如将 a 扩展为 (100,5,1),b 扩展为 (1,5,20),直接进行向量化运算后再调整结果形状,这样可能比 np.vectorize 效率更高。
内容的提问来源于stack exchange,提问作者ego-thales
相关产品推荐
相关产品推荐

