为什么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,)该切片背后的逻辑是什么,它返回一个一维数组?返回(11,300)数组的最佳实践是什么?
发布于 2017-03-25 20:46:05
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)https://stackoverflow.com/questions/43021448
复制相似问题