为什么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)
数组的最佳做法是什么?
答案 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)