【发布时间】: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