我想知道是否有特定的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)
答案 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.unique
从a[:, 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]])