Python可以执行矢量化操作吗?

时间:2013-04-02 21:26:05

标签: python numpy scipy

我想在Python中实现以下Matlab代码:

x=1:100;
y=20*log10(x);

我尝试使用Numpy来执行此操作:

y = numpy.zeros(x.shape)
for i in range(len(x)):
    y[i] = 20*math.log10(x[i])

但这会使用for循环;反正有没有在Matlab中进行矢量化操作?我知道一些简单的数学运算,例如除法和乘法,这是可能的。但是其他更复杂的操作如对数呢?

6 个答案:

答案 0 :(得分:3)

y = numpy.log10(numpy.arange(1, 101)) * 20

In [30]: numpy.arange(1, 10)
Out[30]: array([1, 2, 3, 4, 5, 6, 7, 8, 9])

In [31]: numpy.log10(numpy.arange(1, 10))
Out[31]:
array([ 0.        ,  0.30103   ,  0.47712125,  0.60205999,  0.69897   ,
        0.77815125,  0.84509804,  0.90308999,  0.95424251])

In [32]: numpy.log10(numpy.arange(1, 10)) * 20
Out[32]:
array([  0.        ,   6.02059991,   9.54242509,  12.04119983,
        13.97940009,  15.56302501,  16.9019608 ,  18.06179974,  19.08485019])

答案 1 :(得分:3)

是的,肯定有。

x = numpy.arange(1, 100)
y = 20 * numpy.log10(x)

答案 2 :(得分:2)

Numpy有许多内置数组运算符,如log10。如果它没有列在numpy的文档中,并且你无法通过组合内置方法来生成它,那么就没有简单的方法来有效地完成它。你可以实现一个C级函数来处理numpy数组并编译它,但这比一两行Python代码要多得多。

对于你的情况,你几乎已经有了正确的输出:

y = 20*numpy.log10(x)

答案 3 :(得分:2)

您可能需要查看Numpy文档。这是一个很好的起点:

http://docs.scipy.org/doc/numpy/reference/routines.html

特别与您的问题相关:

http://docs.scipy.org/doc/numpy/reference/routines.math.html

答案 4 :(得分:1)

如果你没有尝试做任何复杂的事情,原始代码也可以这样实现,如果我没有弄错的话,不需要使用numpy。

>>> import math
>>> x = range(1, 101)
>>> y = [ 20 * math.log10(z) for z in x ]

答案 5 :(得分:1)

除了使用numpy标准矢量化函数执行矢量化操作外,您还可以使用numpy.vectorize创建自定义矢量化函数。这是一个例子:

    >>> def myfunc(a, b):
    ...     "Return a-b if a>b, otherwise return a+b"
    ...     if a > b:
    ...         return a - b
    ...     else:
    ...         return a + b
    >>>
    >>> vfunc = np.vectorize(myfunc)
    >>> vfunc([1, 2, 3, 4], 2)
    array([3, 4, 1, 2])