使用Numpy绘制除数个数函数图像遇np.arange相关ValueError问题求助
解决Numpy绘制除数个数函数图像的ValueError问题
错误原因
你的f(t)函数是为单个整数设计的,但调用f(t2)时传入了numpy数组t2,导致函数内的t变成数组。执行t % i == 0会得到布尔数组,而if语句无法直接判断整个数组的真假,因此触发ValueError。
解决方案
方法1:用np.vectorize向量化函数
将原函数包装成能处理数组的向量化函数,逻辑和原代码完全一致:
import matplotlib.pyplot as plt import numpy as np def f(t): num_of_divisors = 0 for i in range(1, t+1): if t % i == 0: num_of_divisors += 1 return num_of_divisors # 向量化函数,使其支持numpy数组输入 f_vec = np.vectorize(f) t2 = np.arange(1, 100, 1) plt.figure() plt.plot(t2, f_vec(t2), color='black') plt.show()
方法2:用Numpy广播高效计算(推荐)
利用Numpy的广播特性批量计算,避免Python循环,效率更高:
import matplotlib.pyplot as plt import numpy as np t2 = np.arange(1, 100, 1) # 生成1到t2最大值的除数数组 divisors = np.arange(1, t2.max() + 1) # 广播计算每个数与所有除数的取模结果,判断是否整除 is_divisible = (t2[:, None] % divisors) == 0 # 对每行求和,得到每个数的除数个数 num_divisors = is_divisible.sum(axis=1) plt.figure() plt.plot(t2, num_divisors, color='black') plt.show()
方法3:列表推导式预处理结果
先通过列表推导式计算每个数的除数个数,再转成numpy数组:
import matplotlib.pyplot as plt import numpy as np def count_divisors(n): count = 0 for i in range(1, n+1): if n % i == 0: count += 1 return count t2 = np.arange(1, 100, 1) # 逐个计算每个数的除数个数 divisor_counts = np.array([count_divisors(t) for t in t2]) plt.figure() plt.plot(t2, divisor_counts, color='black') plt.show()
内容的提问来源于stack exchange,提问作者Amantai Asanbekov
相关产品推荐
相关产品推荐

