Python中两个向量的乘法

时间:2017-05-15 14:31:48

标签: python loops numpy

这在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编写?

3 个答案:

答案 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

在此示例中,ia的当前索引,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。如果您以后需要,可以使用bnp.array(b)转换为numpy数组。

最简单的场景是“复杂数学”是否可以被矢量化。然后你可以这样做:

b = some_complicated_math(a)
c = a*b

如果出于某种原因,您需要将bc置于循环中(我能想到的唯一原因是,如果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]