【问题标题】:python 2D-array, slice/remove the elements from boolean mask, and keep the result as a 2D-arraypython 2D-array,从布尔掩码中切片/删除元素,并将结果保留为 2D-array
【发布时间】:2016-11-08 00:04:56
【问题描述】:

我有一个关于使用布尔掩码屏蔽/切片 2D numpy 数组的问题。这里我有一个np 2D-array 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 x 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的元素,返回新的二维数组。那么在这种情况下我怎么能得到这个呢?

非常感谢您的帮助。

【问题讨论】:

    标签: python arrays numpy slice


    【解决方案1】:

    x[y]x 中选择值,其中y 为True。然而数组x[y] 是一维的。您可以使用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]])
    

    【讨论】:

    • 感谢您的回复。我还使用了 x[y] 并发现它形成了一个一维数组。但是为什么要翻转它以获得所需的结果呢?顺便说一句,这里的 -1 是什么重塑。我通常使用 like reshape(9,10) 来重塑。
    • When using reshape 一维可以是-1。它告诉 reshape 根据数组的大小和其他维度长度来推断实际维度长度。它的基本意思是“做正确的事”。现在reshapedoes not change the order 的元素。 x[y]0, 0, 0, 0, 0, 0, 0, 0, 0, 1 开头。如果您想要1, 0, 0, 0, 0, 0, 0, 0, 0, 0,则必须翻转数组。
    • 感谢您的回复。您提供的方法可以在这种情况下工作。我有一个问题,如果数组 y (布尔数组)的每一列中有多个 False 怎么办,然后我发现你的方法不能每次都有效。您对这种情况有什么建议吗?谢谢。
    • 我不清楚在这种情况下,期望的结果应该是什么。能举个例子吗?
    猜你喜欢
    • 2016-03-10
    • 2019-01-06
    • 2017-08-09
    • 1970-01-01
    • 2011-08-12
    • 2017-09-04
    • 1970-01-01
    • 2017-06-15
    • 1970-01-01
    相关资源
    最近更新 更多