如何使用numpy获取范围的最小值和最大值?

时间:2018-09-25 23:16:10

标签: python numpy range max min

我想知道是否有特定的numpy函数来获取我范围的最高和最低值列。

对于范围,您可以假定numpy数组的每个第一维都代表图像的水平行。

我在图像的每一行中将线条绘制到不同的坐标。

我需要知道每一行中每一行的起点和终点。

假设我有以下数组:

编辑: 我选择了一个不好的范围。这样更好

a = np.array([[0, 1],[0, 2],[0, 3],[0, 4],[1, 0],[1, 1],[1, 2],[1, 3],[1, 4],[1,5],[3, 0],[3, 1],[3, 2],[3, 3],[3, 4],[4, 0],[4, 3],[4, 4],[5,0]])

我想拥有的是

最大值/端点:

array([[0, 4],[1, 5],[3, 4],[4, 4],[5,0]])

最小值/起点:

array([[0, 1],[1, 0],[3, 0],[4, 0],[5,0]])

我会使用if条件遍历整个数组并比较行值,但是这种方式我也不知道为这个任务使用numpy是否有意义。

我知道np.amin / amax(array,axis)的用法,但不知道如何定义有效范围。

EDIT2:

所以我目前唯一的解决方案是做这样的事情:

for i in image_height:
    range_array = a[a[:,0] == i]
    min = np.amin(range_array,0)
    max = np.amax(range_array,0)

2 个答案:

答案 0 :(得分:2)

这是一种解决方案(使用熊猫):

输入:

import pandas as pd
df = pd.DataFrame(a)
minvalues = df.groupby([0]).min().reset_index().values
maxvalues = df.groupby([0]).max().reset_index().values

如果要将最小值和最大值保留为熊猫数据框,请取出.values

输出:

minvalues: array([[0, 1],[1, 0],[3, 0],[4, 0],[5, 0]], dtype=int64)
maxvalues: array([[0, 4],[1, 5],[3, 4],[4, 4],[5, 0]], dtype=int64)

答案 1 :(得分:1)

这里的基本思想是使用np.uniquea[:, 0]中提取第一个唯一值,然后确保以正确的方式对数组进行排序以返回最小或最大结果。如果您不相信该数组将被排序,只需将sort标志设置为True


def get_extrema(a, min=False, sort=False):
    """Finds the minimum or maximum value for each row of an array"""

    if sort:
        a = a[np.lexsort([a[:, 1], a[:, 0]])]

    if not min:
        a = np.flip(a, 0)

    _, idx = np.unique(a[:, 0], return_index=True)

    return a[idx]

>>> get_extrema(a)
array([[0, 4],
       [1, 5],
       [3, 4],
       [4, 4],
       [5, 0]])
>>> get_extrema(a, min=True)
array([[0, 1],
       [1, 0],
       [3, 0],
       [4, 0],
       [5, 0]])