【问题标题】:sum on np.array vs python list: unsupported operand type(s) for %: 'list' and 'int'对 np.array 与 python 列表求和:不支持的操作数类型为 %:'list' 和 'int'
【发布时间】:2021-06-23 10:03:52
【问题描述】:

我需要对集​​合中的一个指标函数求和。

sum() 可以直接在 np.array 上使用,没有问题。

import numpy as np
y = np.arange(10)
ans = sum(y % 2 == 0)

但是,sum() 不能直接用于 python 列表。

z = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
ans = sum(z % 2 == 0)

另一方面,这适用于 np.array 和 python 列表。

ans = sum(each % 2 == 0 for each in z)
print(ans)

问题是为什么? np.array 和 python 列表都应该是可迭代的。是什么让 np.array 支持附加语法?

【问题讨论】:

  • 这只是numpy.array定义了__mod__运算符,而pythonlist没有(docs.python.org/3/library/operator.html)
  • 你很困惑。 sum 可以很好地用于list 对象和np.ndarray 对象,但是,您永远不应该在nd.array 对象上使用sum 函数。您应该直接在数组上使用np.sum 函数或.sum 方法,所以改为(y % 2 == 0).sum()。 原因 您的代码不适用于list 对象是因为% 不适用于列表对象,因此z % 2 == 0 失败。这与可迭代的列表无关。列表对象不支持像 numpy 数组这样的向量化操作。
  • 主题行中的错误明显指向%,而不是总和。

标签: python list numpy sum


【解决方案1】:

这是因为 Python 列表没有开箱即用地实现,如果你愿意,你可以随时继承 Python 列表并拥有自己的自定义列表以允许通过 __mod__ 方法进行模运算:

class MyList(list):
    def __mod__(self, i):
        return [item%i for item in self]
    
>> data = MyList([1,2,3,4,5,6,7,8,9])
>> data%3

[1, 2, 0, 1, 2, 0, 1, 2, 0]

你可以看看官方 Python documentation 了解可以被覆盖的方法。

【讨论】:

  • 那么,类似于C++的重载?我看到有类似的方法,比如__add.__,__div.__等。同样的,我也可以定义矩阵运算,或者一些疯狂的东西,如果我想的话?
  • 可以定义,有很多方法可以覆盖,我附上官方文档的链接,你可以去看看。
  • Python 列表不定义数学运算符。 + 和 * 连接并重复。列表可以包含各种各样的东西,所以只定义数字方法是没有意义的。列表推导是对列表执行元素操作的常用方法。
猜你喜欢
  • 2018-10-19
  • 1970-01-01
  • 2017-01-30
  • 2012-09-06
  • 1970-01-01
  • 2012-12-12
  • 2016-05-31
  • 1970-01-01
相关资源
最近更新 更多