具有保留尺寸的Numpy切片

时间:2017-03-25 20:15:00

标签: python numpy

为什么python不保留条件切片上的尺寸?

如果我执行以下操作,结果就是只有一个维度的数组。

arr1 = np.random.rand(11,300) # .shape = (11,300)                 
arr2 = np.random.rand(11,300) # .shape = (11,300) 
cond = arr2 > 0.5 # .shape = (11,300)  

arr3 = arr1[cond] # .shape = (1649,)

该切片背后的逻辑是什么,它返回一个1d数组? 返回(11,300)数组的最佳做法是什么?

1 个答案:

答案 0 :(得分:2)

https://docs.scipy.org/doc/numpy/user/basics.indexing.html#boolean-or-mask-index-arrays

  

与整数索引数组的情况不同,在布尔情况下,结果是一个一维数组,其中包含索引数组中与布尔数组中所有真实元素对应的所有元素。

它扩展了arr1的尺寸大于遮罩的情况。但基本的观点是逻辑上没有别的东西可以归还。

查看cond(可能是较小的情况)。你如何将True值映射到(11,300)数组?

你看过masked arrays了吗?这保持原有的形状,取代了蒙面的'价值与' - ' (在显示屏中)。

In [284]: arr1 =np.random.randint(0,10,(4,5))
In [285]: arr1
Out[285]: 
array([[4, 6, 5, 8, 8],
       [4, 0, 4, 8, 1],
       [3, 9, 0, 3, 2],
       [8, 8, 7, 5, 7]])
In [286]: mask = arr1<4
In [287]: mask
Out[287]: 
array([[False, False, False, False, False],
       [False,  True, False, False,  True],
       [ True, False,  True,  True,  True],
       [False, False, False, False, False]], dtype=bool)
In [288]: arr1[mask]
Out[288]: array([0, 1, 3, 0, 3, 2])
In [289]: arrM=np.ma.MaskedArray(arr1,~mask)
In [290]: arrM
Out[290]: 
masked_array(data =
 [[-- -- -- -- --]
 [-- 0 -- -- 1]
 [3 -- 0 3 2]
 [-- -- -- -- --]],
             mask =
 [[ True  True  True  True  True]
 [ True False  True  True False]
 [False  True False False False]
 [ True  True  True  True  True]],
       fill_value = 999999)