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

切片广播对象?

  •  1
  • keflavich  · 技术社区  · 10 年前

    我有一个2维数组,它代表了3维数组的掩码,并且可以这样广播。例如。:

    >>> mask.shape
    (101, 100)
    >>> cube.shape
    (500, 101, 100)
    

    创建可广播对象的最佳方法是什么 mask (这是一个数组),可以使用与立方体相同的视图进行索引,并返回相同的掩码?即。:

    >>> cube[100,:,:]
    <some image>
    >>> mask[100,:,:]
    <mask>
    

    所以 mask[n,:,:] 将返回 面具 对于任何 n 或者更好 n 可以用于索引 cube .

    重要的是,我想这样做 没有 制作 面具 内存更大(例如,通过 bigger_mask = np.ones([500,1,1])*self._mask[None,:,:] )

    2 回复  |  直到 10 年前
        1
  •  2
  •   Jaime    10 年前

    像这样吗?

    >>> from numpy.lib.stride_tricks import as_strided
    >>> mask = np.random.randint(2, size=(101, 100)).astype(bool)
    >>> mask_view  = as_strided(mask, shape=(500,)+mask.shape,
    ...                         strides=(0,)+mask.strides)
    >>> mask_view.shape
    (500, 101, 100)
    >>> np.array_equal(mask_view[0], mask_view[499])
    True
    >>> np.all(mask_view == 0)
    False
    >>> mask[:] = 0
    >>> np.all(mask_view == 0)
    True
    
        2
  •  2
  •   hpaulj    10 年前

    lib.stride_tricks 制造 broadcast_arrays 可在 np 数量它使用 as_strided 正如杰米的回答一样,但不需要跨步的知识。

    mask1,cube1 =np.broadcast_arrays(mask, cube)
    mask1.shape
    # (500, 101, 100)
    mask1[100,:,:].shape
    # (101, 100)
    

    mask1 与共享数据 mask :

    In [13]: mask1.__array_interface__
    Out[13]: 
    {'data': (169145016, False),
     'descr': [('', '<f8')],
     'shape': (500, 101, 100),
     'strides': (0, 800, 8),
     'typestr': '<f8',
     'version': 3}
    In [14]: mask.__array_interface__
    Out[14]: 
    {'data': (169145016, False),
     'descr': [('', '<f8')],
     'shape': (101, 100),
     'strides': None,
     'typestr': '<f8',
     'version': 3}