【问题标题】:Remove minima from inner dimension in NumPy 2D array从 NumPy 二维数组的内部维度中删除最小值
【发布时间】:2016-04-20 15:02:58
【问题描述】:

您好,我是 python 和矢量化的新手。

假设你有一个这样的 5x3 numpy 数组:

array([[ -1.262,  -4.034,   2.422],
       [ 13.849,  14.377,   4.951],
       [  3.203,  10.209,  -2.865],
       [  3.618,  -3.51 ,  -7.059],
       [ -0.098,  -5.012,   6.389]])

您希望得到一个新的 5x2 矩阵,并从每个内部维度中移除最小值,如下所示:

array([[ -1.262,   2.422],
       [ 13.849,  14.377],
       [  3.203,  10.209],
       [  3.618,  -3.51 ],
       [ -0.098,   6.389]])

实现这一目标的最佳方法是什么?我想它与矢量化有关?

谢谢!

【问题讨论】:

  • 我总是对行和列感到困惑:正如您在问题中所打印的,您从 rows 中删除了最小值,而不是列。但可能有一种方法可以证明它是按列排列的。相反,将最小值从第二(内部)维度中移除可能会更好。
  • 你是对的。我编辑了我的问题。我也糊涂了
  • 由于您的仅标题编辑与问题文本(行与列)不一致,我已将两者都删除并替换为“内部维度”。

标签: arrays python-3.x numpy vectorization


【解决方案1】:

我认为有一个相对简单的函数,但它可能不在 numpy 中; pandas 可能更容易做到这一点。

使用 numpy,这是一种方法:

In [56]: a = np.array([[ -1.262,  -4.034,   2.422],
       [ 13.849,  14.377,   4.951],
       [  3.203,  10.209,  -2.865],
       [  3.618,  -3.51 ,  -7.059],
       [ -0.098,  -5.012,   6.389]])
In [57]: m = np.argmin(a, axis=1)
In [58]: indices = np.ones(shape=a.shape, dtype=bool)
In [59]: indices[np.arange(5), m] = False    
In [60]: a[indices].reshape((-1, a.shape[1]-1))
Out[60]:
array([[ -1.262,   2.422],
       [ 13.849,  14.377],
       [  3.203,  10.209],
       [  3.618,  -3.51 ],
       [ -0.098,   6.389]])

布尔索引的步骤是“反转”从np.argmin 返回的索引,因为后者返回整数索引,而不是布尔索引。

【讨论】:

  • 我在输入这个答案后才注意到这个问题的重复:那里的两个答案与我的答案相似。
  • 谢谢!这很有帮助:-)
猜你喜欢
  • 2015-06-08
  • 1970-01-01
  • 1970-01-01
  • 2012-06-26
  • 2016-09-06
  • 2020-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多