我有一个二维数组,代表一个三维数组的掩码,可以这样广播。 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}})
答案 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_tricks
在broadcast_arrays
级别提供np
。它使用as_strided
作为Jamie的答案,但不需要跨步的知识。
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}