如何在NumPy矩阵上应用自定义聚合函数?为何vectorize不适用?
问题解决与原理解析
正确实现代码
直接使用np.apply_along_axis并指定轴为1(按行处理),就能得到预期的(100,1)形状输出,代码如下:
import numpy as np def gen_y(X): if np.sum(X) > 2: return 1 elif np.sum(X) < 2: return 0 else: return int(np.random.uniform(0,1) > 0.5) # 示例输入矩阵 X = np.array([[1,1,1], [1,1,0], [0,1,0]]) # 沿行应用函数 y = np.apply_along_axis(gen_y, 1, X) # 转换为(100,1)的列向量形状 y = y.reshape(-1, 1)
运行后输出会符合预期:
array([[1], [0], [0]])
为什么np.vectorize在这里不适用?
vectorize的工作逻辑不符需求:它不是真正的向量化工具,只是个遍历单个元素的语法糖。你的gen_y是为接收整行数组设计的,但vectorize会把矩阵里的单个元素逐个传给gen_y。此时单个元素的求和结果就是它自己(0或1),必然满足np.sum(X) < 2,所以返回全0,这就是你之前得到错误输出的核心原因。- 与
apply_along_axis的冲突:你先用vectorize包装gen_y,再传给apply_along_axis。apply_along_axis会把每行数组传给np_gen_y,但np_gen_y已经被改成处理单个元素的函数,它会把传入的行拆成3个元素分别处理,返回3个值,最终拼接成和输入同形状的矩阵,完全偏离了你的需求。
简单来说:apply_along_axis本身就是用来传递整行/整列数组给函数的,不需要额外用vectorize画蛇添足。
内容的提问来源于stack exchange,提问作者jbuddy_13
相关产品推荐
相关产品推荐

