python – numpy数组子类在每个实例之间共享属性

前端之家收集整理的这篇文章主要介绍了python – numpy数组子类在每个实例之间共享属性前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个奇怪的子类numpy.ndarray问题,感觉像
Values of instance variables of superclass persist across instances of subclass
但是,为了我的例子,我还没有完全理解或使其工作.

阅读
Slightly more realistic example – attribute added to existing array我正在努力做到这一点.我想在数组中添加一个attrs属性来保存单词在字典中的信息.

这是我有的:

  1. import numpy
  2. class dmarray(numpy.ndarray):
  3. def __new__(cls,input_array,attrs={}):
  4. obj = numpy.asarray(input_array).view(cls)
  5. obj.attrs = attrs
  6. return obj
  7.  
  8. def __array_finalize__(self,obj):
  9. # see InfoArray.__array_finalize__ for comments
  10. if obj is None:
  11. return
  12. self.attrs = getattr(obj,'attrs',{})

所以然后用它来展示这个问题

  1. a = dmarray([1,2,3,4])
  2. b = dmarray([1,4])
  3. a.attrs['foo'] = 'bar'
  4. print(b.attrs)
  5. #{'foo': 'bar'}
  6. b.attrs is a.attrs
  7. # True # hmm....

所以b正在拾起我不想要的attrs.令人烦恼的是,如果你这样做:

  1. from datamodel import *
  2. a = dmarray([1,4],attrs={'foo':'bar'})
  3. b = dmarray([1,4])
  4. b.attrs
  5. # {}

那么在世界上,我如何使这个dmarray工作怎么样呢?

编辑:
好的,所以这似乎解决了问题,但我不明白为什么.所以我们可以将问题改为这是做什么以及为什么它的工作原理?

  1. class dmarray(numpy.ndarray):
  2. def __new__(cls,attrs=None):
  3. obj = numpy.asarray(input_array).view(cls)
  4. return obj
  5.  
  6. def __init__(self,attrs=None):
  7. if attrs == None:
  8. attrs = {}
  9. self.attrs = attrs

所以通过从__new __()中删除kwarg并将其放在__init __()中.我刚刚尝试过这个“好吧,它可能会工作”

  1. a = dmarray([1,4])
  2. a.attrs['foo'] = 'bar'
  3. b.attrs
  4. # {}

解决方法

问题在这里:
  1. def __new__(cls,attrs={})

不要在函数头中这样做attrs = {}.预期的结果是(可能)不是你认为的.这是一个常见的Python陷阱.见这里Default Parameter Values in Python

正确的方法如何做到这一点:

  1. def __new__(cls,attrs=None):
  2. if attrs is None:
  3. attrs = {}

猜你在找的Python相关文章