【发布时间】:2015-05-06 16:36:54
【问题描述】:
我可能误解了广播在 Python 中的工作原理,但我仍然遇到错误。
scipy 提供了许多接受两个参数的“特殊函数”,尤其是eval_XX(n, x[,out]) 函数。
见http://docs.scipy.org/doc/scipy/reference/special.html
我的程序使用了许多正交多项式,因此我必须在不同的点评估这些多项式。让我们以scipy.special.eval_hermite(n, x, out=None) 为例。
我希望 x 参数是矩阵形状 (50, 50)。然后,我想在多个点上评估这个矩阵的每个条目。让我们将n 定义为一个numpy 数组narr = np.arange(10)(我们将numpy 导入为np,即import numpy as np)。
所以,打电话
scipy.special.eval_hermite(narr, matrix)
应该返回厄米多项式H_0(matrix), H_1(matrix), H_2(matrix) 等。每个H_X(matrix) 的形状为(50,50),即原始输入矩阵的形状。
然后,我想对这些值求和。所以,我打电话给
matrix1 = np.sum( [scipy.eval_hermite(narr, matrix)], axis=0 )
但我收到广播错误!
ValueError: operands could not be broadcast together with shapes (10,) (50,50)
我可以用for循环解决这个问题,即
matrix2 = np.sum( [scipy.eval_hermite(i, matrix) for i in narr], axis=0)
这给了我正确的答案,以及输出matrix2.shape = (50,50)。但是使用这个 for 循环会大大降低我的代码速度。请记住,我们正在处理矩阵条目。
有没有办法在没有 for 循环的情况下做到这一点?
【问题讨论】:
-
narr并没有那么大——只有 10 个条目——那么为什么这么慢呢?列表推导应该只生成一个包含 10 个数组的列表,np.sum应该很快就求和。 -
@nneonneo 我用这个作为一个简单的例子。实际上,有些矩阵的形状是
(1000, 1000)。 -
这无关紧要,除非您的
narr很大,而且我不知道为什么会这样 - 这只是多项式的阶数,您不需要 1000 度Hermite 多项式。 -
@nneonneo
narr的长度最多为 100。所以是的,它确实减慢了代码的速度。很多。
标签: python for-loop numpy matrix scipy