【问题标题】:Valid generic code to index 2D or 1D masked arrays into 1D arrays in Numpy在 Numpy 中将 2D 或 1D 掩码数组索引到 1D 数组中的有效通用代码
【发布时间】:2021-04-17 05:55:56
【问题描述】:

我想要二维或一维掩码数组的有效代码,以便从中提取一维数组。在 2D 情况下,一列将被完全屏蔽并应被删除(这可以按照in this question for example 所示完成)。

import numpy as np

a = np.ma.masked_array(range(10*2), mask=[True, False]*10).reshape(10,2)
a = np.ma.masked_equal(a, 13)
b = np.ma.masked_equal(np.array(range(10)), 3)

print(a)
print(b)
# [[-- 1]
#  [-- 3]
#  [-- 5]
#  [-- 7]
#  [-- 9]
#  [-- 11]
#  [-- --]
#  [-- 15]
#  [-- 17]
#  [-- 19]]
# [0 1 2 -- 4 5 6 7 8 9]

# HERE I would like the same indexing valid for both (2D and 1D) situations:
a = a[:, ~np.all(a.mask, axis=0)].squeeze()
b = b[:] # I am not supposed to know that b is actually 1D and not a problematic 2D array

print(a)
print(b)
# [1 3 5 7 9 11 -- 15 17 19]
# [0 1 2 -- 4 5 6 7 8 9]
print(a-b)
# [1 2 3 -- 5 6 -- 8 9 10]

实现此目的的有效 Python 代码是什么?

子问题:令我惊讶的是,在我的尝试中,以下确实奏效了:

b = b[:, ~np.all(b.mask, axis=0)].squeeze()
print(b)
# [1 3 5 7 9 11 -- 15 17 19]

为什么我在为这个一维数组使用二维索引时没有收到IndexError: too many indices for array 错误?

有没有更好的选择来解决最初的问题?谢谢!

【问题讨论】:

  • b 可以和 a 一样对待 - b[:, ~np.all(b.mask, axis=0)].squeeze() 有什么问题?
  • 这很讽刺 - 我刚刚删除了我的问题的 2d 部分(认为它会使事情变得过于模糊 - 我已经把它放回去了)。所以我确实同意你的观点,这会起作用,尽管我真的不明白为什么这不会引发IndexError。此外,这意味着这将是一个很好的方法吗? (我期待其他更好/更智能的解决方案,包括花哨的索引、新轴创建等)
  • 您认为您在哪里使用 2D 索引?一维数组也有一个轴“0”。
  • 我猜是因为 [... ,...] 这让我认为我正在索引所有行 : 然后在某些列上索引 ~np.all()... 如果这是一种合适的方法并且没有其他(更好的?)弹出,那么最好的办法可能是发展您的评论(也许解决我的困惑?)作为我接受的答案? (如果我们不能使它有用,那么我会删除不污染 SO 的问题)。还是谢谢!
  • 或者对不起,我的错 - 现在我明白你的意思了,但我没有很好的解释为什么它可以正常工作,所以把问题留在这里,我会考虑一下或者也许其他人可以通过相关文档的链接来澄清它。

标签: python arrays numpy multidimensional-array dimensions


【解决方案1】:

对于两种情况(1D 和 2D),您都可以使用 a = a[:, ~np.all(a.mask, axis=0)].squeeze()

在您示例的一维情况下,您会得到b[:, ~np.all(b.mask, axis=0)],即b[:, True]。这似乎应该引发索引错误,但在这种情况下,True 的行为类似于np.newaxis,即b[:, True] 的结果是一个形状为(10,1) 的数组。请参阅this SO answer 了解为什么会这样以及其背后的动机是什么(答案适用于 0 维情况,但事实证明它同样适用于更高维度)。 squeeze 然后删除了这个额外的维度,这样你就不会注意到它。

【讨论】:

    猜你喜欢
    • 2017-12-01
    • 2021-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    相关资源
    最近更新 更多