如何用纯Numpy实现按行计算图像单元格的Z-score矩阵?
纯Numpy实现按行计算Z-score
问题出在维度不匹配:当你用axis=1计算每行的均值和标准差时,得到的是形状为(15,)的一维数组,而你的pixelscore是(15,5)的二维数组,Numpy无法直接完成一维和二维数组的广播运算。
解决方法很简单:把行均值和标准差的维度扩展为(15,1),让它们能和原数组的每一列对应运算。以下是两种实现方式:
方法一:用[:, np.newaxis]扩展维度
import numpy as np # 模拟15×5的pixelscore矩阵 pixelscore = np.random.rand(15, 5) # 计算每行的均值和标准差,扩展维度为(15,1) row_mean = np.average(pixelscore, axis=1)[:, np.newaxis] row_std = np.std(pixelscore, axis=1)[:, np.newaxis] # 计算按行的Z-score pixelzscore = (pixelscore - row_mean) / row_std
方法二:用reshape调整维度
import numpy as np pixelscore = np.random.rand(15, 5) row_mean = np.average(pixelscore, axis=1).reshape(-1, 1) row_std = np.std(pixelscore, axis=1).reshape(-1, 1) pixelzscore = (pixelscore - row_mean) / row_std
补充说明
- 两种方法本质都是让一维的均值/标准差数组变成列向量,这样Numpy会自动将其广播到每一列,和原数组的每个元素对应运算。
- 如果你的数据中存在标准差为0的行(该行所有元素相同),除法会产生
inf或nan,可以提前处理这类情况,比如:
# 避免除以0,将标准差为0的行替换为1(或其他合理值) row_std[row_std == 0] = 1
内容的提问来源于stack exchange,提问作者user2751530
相关产品推荐
相关产品推荐

