我想用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那样的向量化运算呢?我知道对于一些简单的数学运算,比如除法和乘法,这是可能的。但是其他更复杂的运算,比如对数呢?
jgwigjjp1#
第一个
oprakyz72#
是的,当然有。
x = numpy.arange(1, 100) y = 20 * numpy.log10(x)
yruzcnhs3#
Numpy有很多内置的数组运算符,比如log10。如果它没有在Numpy的文档中列出,并且你不能通过组合内置的方法来生成它,那么就没有简单的方法来高效地完成它。你可以实现一个C级函数来处理Numpy数组,然后编译它,但是这比一两行Python代码要多得多。对于您的情况,您几乎已经有了正确的输出:
y = 20*numpy.log10(x)
1zmg4dgp4#
您可能需要查看Numpy文档。这是一个很好的起点:http://docs.scipy.org/doc/numpy/reference/routines.html而具体与你的问题相关的是:http://docs.scipy.org/doc/numpy/reference/routines.math.html
bq3bfh9z5#
如果你不想做任何复杂的事情,如果我没弄错的话,原始代码也可以用这种方式实现,而不需要使用numpy。
>>> import math >>> x = range(1, 101) >>> y = [ 20 * math.log10(z) for z in x ]
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的标准矢量化函数不同,这不会提高性能
6条答案
按热度按时间jgwigjjp1#
第一个
oprakyz72#
是的,当然有。
yruzcnhs3#
Numpy有很多内置的数组运算符,比如log10。如果它没有在Numpy的文档中列出,并且你不能通过组合内置的方法来生成它,那么就没有简单的方法来高效地完成它。你可以实现一个C级函数来处理Numpy数组,然后编译它,但是这比一两行Python代码要多得多。
对于您的情况,您几乎已经有了正确的输出:
1zmg4dgp4#
您可能需要查看Numpy文档。这是一个很好的起点:
http://docs.scipy.org/doc/numpy/reference/routines.html
而具体与你的问题相关的是:
http://docs.scipy.org/doc/numpy/reference/routines.math.html
bq3bfh9z5#
如果你不想做任何复杂的事情,如果我没弄错的话,原始代码也可以用这种方式实现,而不需要使用numpy。
n3schb8v6#
除了使用numpy标准矢量化函数执行矢量化操作外,您还可以使用numpy.vectorize创建自定义矢量化函数。以下是一个示例:
正如文档中提到的,与numpy的标准矢量化函数不同,这不会提高性能