在Python中计算数组的余弦值

4
我有一个包含1242个数字的数组,名为a。我需要在Python中获取所有数字的余弦值。
当我使用:cos_ra = math.cos(a)时,出现错误提示:

TypeError: only length-1 arrays can be converted to Python scalars

我该如何解决这个问题呢?
谢谢您提前的帮助。

2
不要使用 numpy.math.cos,请使用 numpy.cos - Ashwini Chaudhary
因为math.cos没有向量化,但是np.cos有。 (而且,性能更好,因为只有一个函数调用开销) - smci
5个回答

6

问题在于你在这里使用了numpy.math.cos,它期望你传递一个标量。如果你想将cos应用于可迭代对象,请使用numpy.cos

In [30]: import numpy as np

In [31]: np.cos(np.array([1, 2, 3]))                                                             
Out[31]: array([ 0.54030231, -0.41614684, -0.9899925 ])

错误:

In [32]: np.math.cos(np.array([1, 2, 3]))                                                        
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-32-8ce0f3c0df04> in <module>()
----> 1 np.math.cos(np.array([1, 2, 3]))

TypeError: only length-1 arrays can be converted to Python scalars

我的声望只有11,因为我刚刚加入了StackExchange。 - Srivatsan
@user1469380 接受一个答案并不需要任何声望;-),但是给一个答案投票则需要。 - Ashwini Chaudhary

3

使用 numpy 库:

In [178]: from numpy import *

In [179]: a=range(1242)

In [180]: b=np.cos(a)

In [181]: b
Out[181]: 
array([ 1.        ,  0.54030231, -0.41614684, ...,  0.35068442,
       -0.59855667, -0.99748752])

此外,NumPy数组操作非常快速:

In [182]: %timeit b=np.cos(a)  #numpy is the fastest
10000 loops, best of 3: 165 us per loop

In [183]: %timeit cos_ra = [math.cos(i) for i in a]
1000 loops, best of 3: 225 us per loop

In [184]: %timeit map(math.cos, a)
10000 loops, best of 3: 173 us per loop

3
问题在于math.cos期望得到一个数字作为参数,而你试图传递一个列表。 你需要对列表中的每个元素调用math.cos
尝试使用map
map(math.cos, a)

2

易于理解的方法 受zhangxaochen回答的启发。

最初的回答

np.cos(np.arange(start, end, step))

最初的回答
希望这能帮到你!

1

math.cos() 只能在单个数值上调用,不能在列表上调用。

另一种替代方法,使用列表推导式:

cos_ra = [math.cos(i) for i in a]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接