【问题标题】:why does numpy array behaves this way为什么 numpy 数组会以这种方式表现
【发布时间】: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 *2my_list+my_list 也有不同的含义(参见数字和ndarray
  • 在 Python 中,+*** 等运算符由附加到一个或两个参数的方法实现。其中大多数数字、列表和字符串只有少数几个(与数字的含义不同)。数字 dtype 数组也实现了这些运算符中的大多数。每个类都记录了运算符和方法。
  • @hpaulj 在什么情况下x*2x+x会有不同的含义?对于所有内置数字类型以及所有序列类型,这两个版本是等价的,我也希望它们对于 ndarray 对象是等价的。
  • 对于 x 是一个列表或字符串。结果相同,但与数值计算不同

标签: arrays python-3.x list numpy


【解决方案1】:

np.ndarray__pow__等运算符定义了自己的dunder方法。这就是它如何设法按元素处理这些操作。使用内置列表,您可以使用列表推导:

[x**2 for x in my_list]

您还可以定义自己的类来公开此类自定义行为:

>>> class PowList(list):
...     def __pow__(self, other):
...         return [x**2 for x in self]
... 
>>> my_list = PowList([1, 2, 3, 4, 5])
>>> my_list ** 2
[1, 4, 9, 16, 25]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-22
    • 2014-08-28
    • 1970-01-01
    • 2023-04-01
    • 2016-04-08
    相关资源
    最近更新 更多