在 numpy 数组中查找与所有其他行相比具有最小值的行

Posted

技术标签:

【中文标题】在 numpy 数组中查找与所有其他行相比具有最小值的行【英文标题】:Finding the row in an numpy array that has the smallest values compared to all other rows 【发布时间】:2021-11-18 16:35:19 【问题描述】:

假设我有以下矩阵:

A = [[7,5,1,2]
     [10,1,3,8]
     [2,2,2,3]]

我需要提取与所有其他行相比元素最接近 0 的行,也就是元素最少的行。所以我需要[2,2,2,3]

我尝试了很多东西,np.min、np.amin、np.argmin

但所有人都给了我每行的最小值,例如:

[2,1,1,2]

这不是我要找的。​​p>

如果有人知道正确的函数,您能否指出该函数的文档?

谢谢。

【问题讨论】:

与所有其他行相比,元素最接近 0 的行你如何定义它? @Cresht,虽然它是一个 np 数组,但我不需要在 np 数组上使用 np 函数吗? @Psidom,我不确定如何定义它,就像你知道我们如何在最小二乘法中找到最接近所有其他点的点?我需要最接近[0,0,0,0]的行 【参考方案1】:
import numpy as np

A = np.array([[7,5,1,2],
             [10,1,3,8],
             [2,2,2,3]])

print(print(A[np.argmin(A.sum(axis=1))]))

# [2 2 2 3]

对行求和,然后找到最小值的行索引,最后找到行。

【讨论】:

【参考方案2】:

这取决于您在说最近时如何定义距离。我猜你正在寻找 欧几里得距离,即这里的 L2 范数。在这种情况下,您只需找到所有行的最小平方和:

A[(A ** 2).sum(1).argmin()]
# array([2, 2, 2, 3])

您还可以通过 L1 范数或与 0 的绝对差之和找到 最接近的

A[np.abs(A).sum(1).argmin()]
# array([2, 2, 2, 3])

在这个虚拟示例中,两种方法给出的结果相同,但根据实际数据,它们可能会有所不同。

【讨论】:

【参考方案3】:

想到的第一个方法是找到每一行的最小值。然后找到该数组的 argmin。

row_mins = A.min(axis=0)
row_with_minimum = row_mins.argmin()

然后要得到最小元素的行,做

A[row_with_minimum, :]

【讨论】:

以上是关于在 numpy 数组中查找与所有其他行相比具有最小值的行的主要内容,如果未能解决你的问题,请参考以下文章

过滤具有最小窗口长度的连续序列的 pandas 或 numpy 数组

查找具有唯一列的数组中每一行的最小值

在索引 0 为 0 的数组中查找非零最小值 C++

在 Pandas、Python 中查找具有相同第一列的所有行的最小值、最大值、平均值

在 1D-NumPy 数组中查找奇异值/局部最大值/最小值集(再次)

在 numpy 数组中取每个条目的最小值 +- 10 行