【发布时间】:2020-05-23 23:48:45
【问题描述】:
我正在做一个小型项目,我打算使用纯 Python 而不需要任何外部库。
但是在某个时刻,我得到了一个像 TypeError: unsupported operand type(s) for ** or pow(): 'list' and 'int' 这样的 TypeError。这是因为试图像这样直接将列表中的所有元素平方:
my_list = [0, 7, 2, 9]
print(my_list ** 2)。虽然我已经创建了一个可以将列表平方的函数,但是当我尝试像这样将一个 numpy 数组相乘时:import numpy as np
my_list = np.array([0, 7, 2, 9])
print(my_list ** 2)# prints array[0, 49, 4, 9]
我的问题是为什么会发生这种情况?或者 numpy 是否有一个特殊的属性可以让它表现得像这样?
【问题讨论】:
-
您正在处理两种不同的数据类型:Numpy 与 Python 列表。正如错误所述,运算符 ** 没有为列表定义。您可以编写自己的函数来实现与 Numpy 提供相同结果的列表的运算符。然后,您必须对函数进行矢量化,以便获得与 Numpy 相同的性能。
-
my_list *2和my_list+my_list也有不同的含义(参见数字和ndarray) -
在 Python 中,
+、*和**等运算符由附加到一个或两个参数的方法实现。其中大多数数字、列表和字符串只有少数几个(与数字的含义不同)。数字 dtype 数组也实现了这些运算符中的大多数。每个类都记录了运算符和方法。 -
@hpaulj 在什么情况下
x*2和x+x会有不同的含义?对于所有内置数字类型以及所有序列类型,这两个版本是等价的,我也希望它们对于ndarray对象是等价的。 -
对于
x是一个列表或字符串。结果相同,但与数值计算不同
标签: arrays python-3.x list numpy