【问题标题】:can't multiply sequence by non-int of type 'list'不能将序列乘以“列表”类型的非整数
【发布时间】:2013-02-09 20:15:58
【问题描述】:
def evalPolynomial(coeffs,x):
        return sum([n for n in coeffs] * [x**(m-1)for m in range(len(coeffs),0,-1)]) 

TypeError: 不能将序列乘以“list”类型的非整数

不确定是什么导致了错误?当我分别打印每个语句时,它们都会给我一个列表,但是当我尝试将它们相乘时它不起作用。

【问题讨论】:

  • 你到底想做什么?
  • 对于一个列表coeffs和一个变量x,返回序列a-sub(n)*x^(n) + a-sub(n-1)*x^(n- 1)...a-sub(0)*x*0
  • 用于多项式估计
  • 你可能想看看bumpy,它允许数组像这样相乘。

标签: python


【解决方案1】:

Python list s 只能乘以一个整数,在这种情况下 list 的元素会重复:

>>> [1,2,3] * 3
[1, 2, 3, 1, 2, 3, 1, 2, 3]

如果您想要矢量运算,请改用numpy.ndarray

>>> import numpy as np
>>> ar = np.array([1,2,3])
>>> ar * 3
array([3, 6, 9])

特别是有一个用于卷积的 numpy 函数(即多项式乘法):

>>> a = np.array([1,2,3]) # 1 + 2x + 3x^2
>>> b = np.array([4,5,6]) # 4 + 5x + 6x^2
>>> np.convolve(a, b)     # (1 + 2x + 3x^2) * (4 + 5x + 6x^2)
array([ 4, 13, 28, 27, 18]) # 4 + 13x + 28x^2 + 27x^3 + 18x^4

如果您想计算多项式,可以使用 numpy.polyval 函数来执行此操作。

请记住,使用 numpy 会限制整数的大小,因此如果系数太大以至于溢出,您可能会得到错误的结果。

【讨论】:

  • Python 列表可以乘以一个变量。实际上要清楚,我试图创建一个可变长度的二维列表。我已经发布了我的 2 行 sn-p。 #code def buildAdjMat(matLen): adjMat = [[0]*int(matLen)]*int(matLen)
  • @SteveJobs 当我说 integer 时,我指的是任何以整数类型值结束的表达式。
  • 帮了我很多忙!
【解决方案2】:

表达式[n for n in coeffs] 是一个整数list
列表确实支持乘以整数,但这意味着“制作一个 是起始列表的 n 个副本”;这不是您在这个数学上下文中想要的。

我建议您查看numpy(或scipy,它主要是numpy 的超集)包来帮助解决这个问题。它有一个函数polyval 用于准确评估您想要的内容,还提供了一个基于类的表示polynomial。一般来说,要在 Python 中进行数值计算,您应该查看这些包。

但如果你想自己动手,你需要在列表推导中进行数学运算, 一种方法是:

return sum( [ n*x**(i-1) for (n,i) in zip( coeffs, xrange(len(coeffs),0,-1)) ] )

【讨论】:

    【解决方案3】:

    您正在尝试将多个两个列表放在一起。这在 python 中不是一个有效的操作。

    如果您想将两个列表中的每个对应元素相乘,您可以使用以下方法:

    def evalPolynomial(coeffs,x):
            return sum(x * y for x, y in zip(coeffs, (x**(m-1)for m in range(len(coeffs),0,-1))))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-03
      • 1970-01-01
      • 2018-04-20
      • 2011-04-06
      • 2014-12-28
      • 2010-11-15
      • 2012-09-17
      相关资源
      最近更新 更多