切片广播对象?

时间:2014-08-23 14:01:35

标签: python arrays numpy masking

我有一个二维数组,代表一个三维数组的掩码,可以这样广播。 e.g:

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

创建像mask(可以使用与多维数据集相同的视图索引)的>>> cube[100,:,:] <some image> >>> mask[100,:,:] <mask> (可以是数组)的可广播对象的最佳方法是什么,返回相同的掩码?即:

mask[n,:,:]

所以mask会为任何n返回n,或者更好的是cube可用于索引mask

重要的是,我想这样做使bigger_mask = np.ones([500,1,1])*self._mask[None,:,:]更大的内存(例如,通过{{1}})

2 个答案:

答案 0 :(得分:2)

这样的东西?

>>> 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

答案 1 :(得分:2)

lib.stride_tricksbroadcast_arrays级别提供np。它使用as_strided作为Jamie的答案,但不需要跨步的知识。

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

mask1mask分享数据:

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}