Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 对广播对象进行切片?_Python_Arrays_Numpy_Masking - Fatal编程技术网

Python 对广播对象进行切片?

Python 对广播对象进行切片?,python,arrays,numpy,masking,Python,Arrays,Numpy,Masking,我有一个二维数组,它代表一个三维数组的掩码,并且可以这样进行广播。e、 g: >>> mask.shape (101, 100) >>> cube.shape (500, 101, 100) 创建可广播对象(如掩码)的最佳方法是什么?掩码是一个数组,可以使用与多维数据集相同的视图进行索引,并返回相同的掩码?i、 e: >>> cube[100,:,:] <some image> >>> mask[100,:,:

我有一个二维数组,它代表一个三维数组的掩码,并且可以这样进行广播。e、 g:

>>> mask.shape
(101, 100)
>>> cube.shape
(500, 101, 100)
创建可广播对象(如掩码)的最佳方法是什么?掩码是一个数组,可以使用与多维数据集相同的视图进行索引,并返回相同的掩码?i、 e:

>>> cube[100,:,:]
<some image>
>>> mask[100,:,:]
<mask>
所以mask[n,:,:]将返回任意n的mask,或者更好的是,返回可用于索引多维数据集的任意n的mask

重要的是,我希望这样做时不会使内存中的掩码变大,例如,通过做更大的\u mask=np.ones[500,1,1]*self.\u mask[None,:,:,:]

类似的事情

>>> 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
像这样的

>>> 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
lib.stride_技巧使广播_数组在np级别可用。它使用了杰米回答中的大步,但不需要大步知识

mask1,cube1 =np.broadcast_arrays(mask, cube)
mask1.shape
# (500, 101, 100)
mask1[100,:,:].shape
# (101, 100)
mask1与掩码共享数据:

lib.stride_技巧使广播_数组在np级别可用。它使用了杰米回答中的大步,但不需要大步知识

mask1,cube1 =np.broadcast_arrays(mask, cube)
mask1.shape
# (500, 101, 100)
mask1[100,:,:].shape
# (101, 100)
mask1与掩码共享数据:


这看起来很棒,但它似乎仍在内存中复制掩码500次:>>>mask_view.nbytes 5050000>>>mask.nbytes 10100。我是否误解了nbytes返回的内容?是C源代码中如何计算.size和.nbytes的定义。它只看形状,而不看步幅,因此它不一定代表实际使用的内存。您可以通过使第一个维度大于RAM所能容纳的维度来检查是否使用了额外的内存。这看起来很好,但它似乎仍在内存中复制掩码500次:>>>mask_view.nbytes 5050000>>>mask.nbytes 10100。我是否误解了nbytes返回的内容?是C源代码中如何计算.size和.nbytes的定义。它只看形状,而不看步幅,因此它不一定代表实际使用的内存。你可以通过使第一个维度大于你的RAM所能容纳的维度来检查是否使用了额外的内存。这很好,但需要我将整个多维数据集放在内存中。这是一个视图,而不是副本。但是多维数据集对象必须存在。我想如果它是一个memmap的数组,它不必存在于内存中,但它仍然必须存在。这很好,但它要求我将整个多维数据集都存在于内存中。它是一个视图,而不是副本。但多维数据集对象必须存在。我想如果它是一个memmap的数组,它不一定要在内存中,但它仍然必须存在。