代码之家  ›  专栏  ›  技术社区  ›  user2699

如何找到记录数组的“基”

  •  0
  • user2699  · 技术社区  · 6 年前

    怎么样 base 为记录数组确定? 这个 docs seem 下面是一个简单的数组,以及一个从中创建的记录数组。

    >>> arr = np.zeros(10, dtype=[('a', float), ('b', int), ('c', int)])
    >>> rec = arr.view(np.recarray)
    

    >>> arr is rec
    False
    
    >>> arr is rec.base
    True
    

    这个 为常规数组的字段访问正确设置。

    >>> arr['a'].base is arr
    True
    

    None 或者其他我尝试过的东西。

    >>> rec['a'].base is arr
    False
    
    >>> rec['a'].base is rec
    False
    
    >>> rec['a'].base is None
    False
    
    >>> rec['a'].base is rec['a']
    False
    
    >>> rec['a'].base is rec['a'].base
    False
    
    >>> f = rec['a']
    >>> f.base is f
    False
    

    它的行为与索引切片的预期一样

    >>> arr[:3].base is arr
    True
    
    >>> rec[:3].base is rec
    True
    

    它肯定还是指向同一个记忆

    >>> arr[0]
    (0., 0, 0)
    
    >>> rec['a'] = 1
    
    >>> arr[0]
    (1., 0, 0)
    

    那么,如何找到记录数组的实际基呢?

    1 回复  |  直到 6 年前
        1
  •  1
  •   user2357112    6 年前

    “实际基数”仍然是 base 属性。如果你想跟着 基础

    def recursive_base(arr):
        while arr.base is not None:
            arr = arr.base
        return arr
    

    如果你想知道为什么 rec['a'].base is not rec ,然后看看 recarray.__getitem__ :

    def __getitem__(self, indx):
        obj = super(recarray, self).__getitem__(indx)
    
        # copy behavior of getattr, except that here
        # we might also be returning a single element
        if isinstance(obj, ndarray):
            if obj.dtype.fields:
                obj = obj.view(type(self))
                if issubclass(obj.dtype.type, nt.void):
                    return obj.view(dtype=(self.dtype.type, obj.dtype))
                return obj
            else:
                return obj.view(type=ndarray)
        else:
            # return a single element
            return obj
    

    在您的例子中,返回的对象是 ndarray.__getitem__ ,和 基础 返回的对象是 ndarray.\u获取项目__ . 不过,一般来说,NumPy是否会压扁市场还不能保证 设置新数组的 .