根据条件切片2D的numpy数组

4
我有一个numpy数组。
import numpy as np

a = np.array([
[999, 999, 999, 999, 999, 999, 999, 999, 999, 999],
[999, 999, 999, 1, 2, 3, 4, 999, 999, 999],
[999, 999, 999, 5, 6, 7, 8, 999, 999, 999],
[999, 999, 999, 9, 10, 11, 12, 999, 999, 999],
[999, 999, 999, 999, 999, 999, 999, 999, 999, 999]])

如何使用numpy切片返回仅包含不同于999的过滤值?
filtered = np.where(a != 999)
In [5]: filtered
Out[5]: 
(array([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]),
 array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2,
    3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5,
    6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8,
    9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1,
    2, 3, 4, 5, 6, 7, 8, 9]))

希望输出结果:

output = np.array([
    [1, 2, 3, 4],
    [5, 6, 7, 8],
    [9, 10, 11, 12]])
3个回答

1

您的情况比较特殊,因为子数组是矩形的。您可以使用高级索引获取平坦值:

>>> a[filtered]
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12])

如果您已经知道形状,您可以重新塑造它:

>>> a[filtered].reshape(3,4)
array([[ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 9, 10, 11, 12]])

然而,在一般情况下,不能保证输入数据在过滤后会留下一个矩形数组。例如,考虑如果输入数组中有 a[0,0] == 13,那么输出数组应该是什么样子的。

抱歉,在发表评论之前我没有看到你的修改。 主要问题是我真的不知道矩阵中有效数字的形状。这只是一个原始的例子。 在我的情况下,我不会像@wim指出的那样得到一个外部数字(即a [0,0] == 13)。 - arnaldo
给出所需的输出,其中有效数字不整齐地包含在矩形内,例如如果 a[0,1] != 999,而其他所有内容都相同。 - wim
如果盒子内部的元素等于999怎么办? - wim
返回翻译后的文本:任何一个有效框外都不会是数字999,而任何一个有效框内都不会是等于999的数。 - arnaldo
在这种情况下,我认为您可以放心使用Ophion在此发布的解决方案。 - wim
显示剩余2条评论

1
你可以做以下事情:

>>> mask = (a!=999)
>>> dim1 = np.any(mask, axis=1).sum()
>>> a[mask].reshape(dim1, -1)
array([[ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 9, 10, 11, 12]])

当然,这假设您在整个数组中只有一个连续的盒子。

特殊情况的好解决方案。对于“其他”情况可能会引发ValueError异常。 - wim

1
你也可以这样做。使用条件创建一个2D掩码。将条件掩码转换为int或float,取决于数组,并将其与原始数组相乘。
In [8]: arr
Out[8]: 
array([[ 1.,  2.,  3.,  4.,  5.],
       [ 6.,  7.,  8.,  9., 10.]])

In [9]: arr*(arr % 2 == 0).astype(np.int) 
Out[9]: 
array([[ 0.,  2.,  0.,  4.,  0.],
       [ 6.,  0.,  8.,  0., 10.]])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接