如何不使用np.mean()实现支持n维数组的NumPy均值函数?
不借助内置函数实现n维数组的通用均值计算
我正在学习编程,出于思维实验目的,希望在不使用内置函数(已知内置函数已优化,实际场景会优先使用)的前提下实现均值计算。目前已写出仅适用于向量的均值函数,但传入矩阵时会失效;修改后的适配矩阵版本又无法处理向量及三维以上数组。想了解如何不借助内置函数完成n维数组的求和,进而实现通用的均值计算。
尝试的代码如下:
第一个版本(仅支持向量):
def take_mean(arr): sum = 0 for i in arr: sum += i mean = sum/np.size(arr) return mean
第二个版本(仅支持矩阵,且存在bug:应累加j而非i):
def take_mean(arr): sum = 0 for i in arr: for j in i: sum += i mean = sum/np.size(arr) return mean
核心思路:递归遍历n维数组求和
n维数组是嵌套的可迭代结构,通过递归可以逐层遍历:若当前元素是数值则直接累加,若是可迭代的子数组(排除字符串这类特殊可迭代对象),则递归进入子数组继续处理。
通用实现代码
def recursive_sum(arr): total = 0 for element in arr: # 判断是否为可迭代的数组类型(排除字符串避免误处理) if isinstance(element, (list, tuple)): # 若用numpy数组,可改为isinstance(element, np.ndarray) total += recursive_sum(element) else: total += element return total def take_mean(arr): # 递归统计总元素个数,脱离内置函数依赖 def count_elements(arr): count = 0 for element in arr: if isinstance(element, (list, tuple)): count += count_elements(element) else: count += 1 return count total_sum = recursive_sum(arr) element_count = count_elements(arr) if element_count == 0: raise ValueError("数组不能为空") return total_sum / element_count
代码说明
- 递归求和:
recursive_sum逐层遍历数组,遇到子数组就递归深入,直到找到数值元素完成累加。 - 元素计数:
count_elements用同样的递归逻辑统计所有维度的总元素数,完全脱离np.size这类内置函数。 - 均值计算:总求和除以总元素数,同时增加空数组判断避免除以0错误。
测试示例
# 测试向量 vec = [1, 2, 3, 4] print(take_mean(vec)) # 输出2.5 # 测试矩阵 mat = [[1,2], [3,4]] print(take_mean(mat)) # 输出2.5 # 测试三维数组 three_d = [[[1,2], [3,4]], [[5,6], [7,8]]] print(take_mean(three_d)) # 输出4.5
注意事项
- 若使用numpy数组而非原生列表/元组,需将
isinstance的判断条件改为isinstance(element, np.ndarray)。 - 代码默认元素为数值类型,若数组中存在非数值元素需额外添加类型校验。
内容的提问来源于stack exchange,提问作者Kliker
相关产品推荐
相关产品推荐

