【问题标题】:How create data structure with similar numpy nd array如何创建具有类似 numpy nd 数组的数据结构
【发布时间】:2020-02-20 13:31:23
【问题描述】:

我有下一个功能:

def check_smaller_zeros(v):
   return v < 0

当我使用 numpy 创建数组时,我可以为逐个元素的测量编写下一个代码:

v_1 = numpy.array([1, 2, -4, -1])
result = check_smaller_zeros(v_1)
# result: [False, False, True, True]

但是当我尝试使用 tuple、set、frozenset 和 list/array reise 重复它时,下一个错误:

TypeError: '<' not supported between instances of 'tuple' and 'int'

究竟是什么让 numpy 数组具有这种行为的能力?这看起来很方便,但有点不明显

【问题讨论】:

标签: python numpy data-structures


【解决方案1】:

Python 允许您使用特殊的“dunder”(双下划线)方法覆盖运算符。例如,让我们创建一个继承自tuple 的自定义数据结构。要让&lt; 执行逐项比较,我们只需要覆盖__lt__ 方法。

In [1]: class MyList(tuple):
      :     def __lt__(self, other):
      :         return tuple(v < other for v in self)
      :

In [1]:

In [2]: l = MyList([1,2,3,4,5])

In [3]: l < 3
Out[3]: (True, True, False, False, False)

可以在Data Model 下的 Python 文档中找到所有此类方法的列表。

【讨论】:

  • 感谢您的回答。要回答这个问题,你只需要去源代码并找到所需的方法)但他需要找到。在 kotlin 语言中,例如在 doc 中,这一刻不是很明显 - kotlinlang.org/docs/reference/…。在 python 中有一个类似的“标准算术”操作列表可以被覆盖(例如,你如何使用__lt__)?
  • 好问题,我已经在答案中添加了指向 Python 文档(即数据模型)相应部分的链接。
【解决方案2】:

np.array 与元组、列表等非常不同。 如果你想概括你的功能,你必须考虑每种情况。

In [111]: def check_smaller_zeros(v):
     ...:    if type(v) is np.array:
     ...:        return v < 0
     ...:    elif type(v) in (list, tuple):
     ...:        return [x<0 for x in v]
     ...:

In [112]: check_smaller_zeros((-1,1,2,3,4,5))
Out[112]: [True, False, False, False, False, False]

在某些情况下,您可以简单地将对象转换为 np.array。但这取决于对象,您必须提前定义用例。

In [114]: def check_smaller_zeros(v):
     ...:    if type(v) is np.array:
     ...:        return v < 0
     ...:    else:
     ...:        return np.array(v) < 0
     ...:
     ...:

In [115]: check_smaller_zeros((-1,1,2,3,4,5))
Out[115]: array([True, False, False, False, False, False])

【讨论】:

  • np.array 不是类型 - 它是构造数组的函数。在数组上调用函数的第一个版本会返回 None,而在数组上调用第二个版本会在执行比较之前生成不必要的副本。此外,如果您要为不同的输入类型返回不同的输出类型,则返回一个元组作为元组输入的输出比返回一个列表更有意义。
  • 您的代码的第二个版本可以简化为return np.asarray(v) &lt; 0
  • 无论如何,这篇文章并没有回答这个问题,这就是 NumPy 数组如何支持它们的行为。接受的答案回答了问题。
猜你喜欢
  • 1970-01-01
  • 2022-06-15
  • 2018-04-01
  • 2019-09-29
  • 1970-01-01
  • 2020-12-17
  • 2018-09-22
  • 2023-03-03
  • 1970-01-01
相关资源
最近更新 更多