我有一个关于使用布尔掩码屏蔽/切片2D numpy数组的问题。这里我有一个np 2D数组x,它是
x=np.tile(np.arange(10).reshape(10,1),(1,10))
[[0 0 0 0 0 0 0 0 0 0]
[1 1 1 1 1 1 1 1 1 1]
[2 2 2 2 2 2 2 2 2 2]
[3 3 3 3 3 3 3 3 3 3]
[4 4 4 4 4 4 4 4 4 4]
[5 5 5 5 5 5 5 5 5 5]
[6 6 6 6 6 6 6 6 6 6]
[7 7 7 7 7 7 7 7 7 7]
[8 8 8 8 8 8 8 8 8 8]
[9 9 9 9 9 9 9 9 9 9]]
x是10乘10的数组,每列都相同。如果有更好的方法来生成这个,你能指出来吗?谢谢。然后有一个布尔数组
y=(x!=np.arange(10))
[[False True True True True True True True True True]
[ True False True True True True True True True True]
[ True True False True True True True True True True]
[ True True True False True True True True True True]
[ True True True True False True True True True True]
[ True True True True True False True True True True]
[ True True True True True True False True True True]
[ True True True True True True True False True True]
[ True True True True True True True True False True]
[ True True True True True True True True True False]]
现在,我希望获得结果数组,
[[1 0 0 0 0 0 0 0 0 0]
[2 2 1 1 1 1 1 1 1 1]
[3 3 3 2 2 2 2 2 2 2]
[4 4 4 4 3 3 3 3 3 3]
[5 5 5 5 5 4 4 4 4 4]
[6 6 6 6 6 6 5 5 5 5]
[7 7 7 7 7 7 7 6 6 6]
[8 8 8 8 8 8 8 8 7 7]
[9 9 9 9 9 9 9 9 9 8]]
x中的元素,其y中的对应位置值为False,将返回新的2D数组。那么我怎么能得到这种情况呢?
非常感谢你的帮助。
答案 0 :(得分:2)
x[y]
从x
中选择y
为真的值。然而,数组x[y]
是1维的。您可以使用reshape(9,-1)
对其进行重新整形以获得9行(无论多少列都有意义)。要获得所需的结果,您必须从左到右翻转数组:
In [81]: np.fliplr(x[y].reshape(9,-1))
Out[84]:
array([[1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[2, 2, 1, 1, 1, 1, 1, 1, 1, 1],
[3, 3, 3, 2, 2, 2, 2, 2, 2, 2],
[4, 4, 4, 4, 3, 3, 3, 3, 3, 3],
[5, 5, 5, 5, 5, 4, 4, 4, 4, 4],
[6, 6, 6, 6, 6, 6, 5, 5, 5, 5],
[7, 7, 7, 7, 7, 7, 7, 6, 6, 6],
[8, 8, 8, 8, 8, 8, 8, 8, 7, 7],
[9, 9, 9, 9, 9, 9, 9, 9, 9, 8]])