【发布时间】:2020-06-26 08:18:52
【问题描述】:
这与another question I have 有关,但我正在寻找矢量化/广播解决方案。
我希望在这里尝试使用np.fromfunction,但遇到了问题。
MWE 是
# L1 and L2 will range from 0 to 3 typically, sometimes up to 5
# all of the following are dummy values but match correct `type`
L1, L2, x1, x2, fac = 2, 3, 2.0, 4.5, 2.3
saved_values = np.random.uniform(high=75.0, size=[max(L1,L2) + 1, max(L1,L2) + 1])
facts = np.random.uniform(high=65.0, size=[L1 + L2 + 1])
val = 0
for i in range(L1+1):
sf = saved_values[L1][i] * x1 ** (L1 - i)
for j in range(L2 + 1):
m = i + j
if m % 2 == 0:
num = sf * facts[m] / (2 * fac) ** (m / 2)
val += saved_values[L2][j] * x1 ** (L1 - j) * num
我想使用np.fromfunction 用必要的值填充矩阵,而不是使用未矢量化且可能较慢(矢量化对我来说更重要)的双循环
我尝试了以下
matrix = np.fromfunction(lambda i, j:
saved_values[L1][i] * x1 ** (L1 - i) *
saved_values[L2][j] * x2 ** (L2 - j) *
facts[i+j] / (2 * fac) **( (i+j) / 2),
(L1+1,L2+1)
)
这会生成双 for 循环矩阵,然后我需要检查它并使任何会失败的 (i+j) % 2 == 0 具有零值,然后对矩阵中的所有元素求和。
然而
我收到以下错误
Traceback (most recent call last):
File "main.py", line 54, in <module>
(L1+1,L2+1)
File "/usr/lib/python3/dist-packages/numpy/core/numeric.py", line 1808, in fromfunction
return function(*args,**kwargs)
File "main.py", line 53, in <lambda>
facts[i+j] / (2 * fac) **( (i+j) / 2),
IndexError: arrays used as indices must be of integer (or boolean) type
【问题讨论】:
-
fromfunction不会“矢量化”。当你遇到这样的问题时,写一个小函数来告诉你i,j实际上是什么。
标签: python-3.x numpy numpy-ufunc