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

9o685dep  于 2022-11-10  发布在  Python
关注(0)|答案(6)|浏览(158)

我想用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那样的向量化运算呢?我知道对于一些简单的数学运算,比如除法和乘法,这是可能的。但是其他更复杂的运算,比如对数呢?

oprakyz7

oprakyz72#

是的,当然有。

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

yruzcnhs3#

Numpy有很多内置的数组运算符,比如log10。如果它没有在Numpy的文档中列出,并且你不能通过组合内置的方法来生成它,那么就没有简单的方法来高效地完成它。你可以实现一个C级函数来处理Numpy数组,然后编译它,但是这比一两行Python代码要多得多。
对于您的情况,您几乎已经有了正确的输出:

y = 20*numpy.log10(x)
1zmg4dgp

1zmg4dgp4#

您可能需要查看Numpy文档。这是一个很好的起点:
http://docs.scipy.org/doc/numpy/reference/routines.html
而具体与你的问题相关的是:
http://docs.scipy.org/doc/numpy/reference/routines.math.html

bq3bfh9z

bq3bfh9z5#

如果你不想做任何复杂的事情,如果我没弄错的话,原始代码也可以用这种方式实现,而不需要使用numpy。

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

n3schb8v6#

除了使用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])

正如文档中提到的,与numpy的标准矢量化函数不同,这不会提高性能

相关问题