python - 使用 NumPy 更优化的数学函数
问题描述
对于我的课程,我需要使用 NumPy 编写更优化的数学函数。问题是,当使用 NumPy 时,我的解决方案在使用原生 Python 时速度较慢。
- 将数组的所有元素立方并求和的函数
Python:
def cube(x):
result = 0
for i in range(len(x)):
result += x[i] ** 3
return result
我的,使用 NumPy(慢 15-30%):
def cube(x):
it = numpy.nditer([x, None])
for a, b in it:
b[...] = a*a*a
return numpy.sum(it.operands[1])
- 一些随机计算函数
Python:
def calc(x):
m = sum(x) / len(x)
result = 0
for i in range(len(x)):
result += (x[i] - m)**4
return result / len(x)
NumPy(慢 10 倍以上):
def calc(x):
m = numpy.mean(x)
result = 0
for i in range(len(x)):
result += numpy.power((x[i] - m), 4)
return result / len(x)
我不知道如何解决这个问题,到目前为止我已经尝试过 NumPy 的随机函数
解决方案
详细说明评论中所说的内容:
Numpy 的强大之处在于能够在快速 c/fortran 中完成所有循环,而不是慢速 Python 循环。例如,如果您有一个数组x
,并且想要计算该数组中每个值的平方,您可以这样做
y = []
for value in x:
y.append(value**2)
甚至(通过列表理解)
y = [value**2 for value in x]
但是如果你可以在 numpy 中执行所有循环,它会快得多
y = x**2
(假设x
已经是一个 numpy 数组)。
因此,对于您的示例,在 numpy 中执行此操作的正确方法是
1.
def sum_of_cubes(x):
result = 0
for i in range(len(x)):
result += x[i] ** 3
return result
def sum_of_cubes_numpy(x):
return (x**3).sum()
def calc(x):
m = sum(x) / len(x)
result = 0
for i in range(len(x)):
result += (x[i] - m)**4
return result / len(x)
def calc_numpy(x):
m = numpy.mean(x) # or just x.mean()
return numpy.sum((x - m)**4) / len(x)
请注意,我假设输入x
已经是一个 numpy 数组,而不是一个常规的 Python 列表:如果你有一个 list lst
,你可以用它创建一个数组arr = numpy.array(lst)
。
推荐阅读
- python - “for循环”输出不正确(总是使用“else”的参数)
- python - 参数的多个值
- html - 标签不显示在浏览器中
- reactjs - TypeScript Rest Props - 允许任何道具或告诉组件它们将成为哪些道具
- python - psycopg2 未连接到 CentOS8 上的 Postgres
- python - 安装 rioxarray 时出现 RuntimeError
- azure - Azure Active Directory - 用户的组声明不是最新的
- java - spring 有时会在控制器方法执行之前和之后做一些缓慢的过程吗?
- javascript - 使用 JavaScript 缩放页面
- entity-framework - 实体框架6中的Cascade-none