这在Fortran,Basic或甚至是Matlab中都是微不足道的,但是我无法在Python + Numpy中使用它。我已经尝试了很多建议和例子,但它们太简单了,无法解决这个问题。伪代码如下:
Given a vector a(i) with 500 values.
for i=1 to 500
b(i) = some complicated math
c(i) = a(i) * b(i)
如何用Python和Numpy编写?
答案 0 :(得分:2)
您可以使用Numpy multiply
function来获取元素矢量积。尝试这样的事情:
import numpy as np
a = np.arange(500)
b = 10 * np.arange(500) + 3 # an example of the "complex math"
c = np.multiply(a, b)
请注意,数学运算(*
和+
)会自动应用于b
的所有元素。
答案 1 :(得分:1)
这取决于“复杂数学”是否可以被矢量化以及它是一行还是几行。如果它不能被矢量化并且需要多行,这是更复杂的解决方案,你可以这样做:
b = np.zeros_like(a)
for i, ai in enumerate(a):
b[i] = some_complicated_math(ai)
c = a*b
在此示例中,i
是a
的当前索引,ai
是该索引处的值(相当于a[i]
)。 enumerate
为您提供值及其(1D)索引。 numpy数组中的乘法是自动元素化的。
如果“复杂的数学”不能被矢量化但可以在一行上完成,你可以这样做:
b = [some_complicated_math(ai) for ai in a]
c = a*b
在这种情况下b
是一个列表(不是一个numpy数组),但python足够聪明,可以将b
转换为幕后的numpy数组,因为它与numpy相乘数组a
。如果您以后需要,可以使用b
将np.array(b)
转换为numpy数组。
最简单的场景是“复杂数学”是否可以被矢量化。然后你可以这样做:
b = some_complicated_math(a)
c = a*b
如果出于某种原因,您需要将b
和c
置于循环中(我能想到的唯一原因是,如果b
以某种方式引用c
),那么你可以这样做:
b = np.zeros_like(a)
c = np.zeros_like(a)
for i, ai in enumerate(a):
b[i] = some_complicated_math(ai)
c[i] = a[i]*b[i]
答案 2 :(得分:0)
我会尝试这样的事情
import numpy as np
n = 500
# Allocate memory for a, b, c
a = np.zeros((n))
b = np.zeros((n))
c = np.zeros((n))
# Loop over element
for i in range(n):
b[i] = some complicated math
c[i] = a[i] * b[i]