You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 07:54:51