Как нарезать массив вокруг минимума - PullRequest
1 голос
/ 10 марта 2020

Я пытаюсь определить функцию, которая находит минимальное значение массива и разрезает его вокруг этого значения (плюс или минус 5 позиций). Мой массив выглядит примерно так:

[[ 0.          9.57705087]
 [ 0.0433      9.58249315]
 [ 0.0866      9.59745942]
 [ 0.1299      9.62194967]
 [ 0.1732      9.65324278]
 [ 0.2165      9.68725702]
 [ 0.2598      9.72263184]
 [ 0.3031      9.75256437]
 [ 0.3464      9.77025178]
 [ 0.3897      9.76889121]
 [ 0.433       9.74167982]
 [ 0.4763      9.68589645]
 [ 0.5196      9.59881999]
 [ 0.5629      9.48861383]
 [ 0.6062      9.3593597 ]]

Тем не менее, я имею дело с гораздо большими наборами, и мне нужна функция, которая может делать это автоматически, без необходимости вручную находить минимальное значение и затем разрезать массив вокруг него. Я хочу найти минимальное значение массива [:, 1] и затем применить нарезку ко всему массиву.

Ответы [ 2 ]

3 голосов
/ 10 марта 2020

Используйте np.argmin(), чтобы получить индекс минимального значения. Это будет сделано с использованием только второго столбца (вы не указали, является ли это минимальное значение по столбцам или нет).

your_array[:np.argmin(your_array[:, 1]), :]

Чтобы разделить его на 5 значений дальше минимального, используйте:

your_array[:np.argmin(your_array[:, 1]) + 5, :]
0 голосов
/ 11 марта 2020

Учитывая ваш объективный массив:

import numpy as np

anarray = np.array([[ 0., 9.57705087],
                    [ 0.0433, 9.58249315],
                    [ 0.0866, 9.59745942],
                    [ 0.1299, 9.62194967],
                    [ 0.1732, 9.65324278],
                    [ 0.2165, 9.68725702],
                    [ 0.2598, 9.72263184],
                    [ 0.3031, 9.75256437],
                    [ 0.3464, 9.77025178],
                    [ 0.3897, 9.76889121],
                    [ 0.433, 9.74167982],
                    [ 0.4763, 9.68589645],
                    [ 0.5196, 9.59881999],
                    [ 0.5629, 0.48861383],
                    [ 0.6062, 9.3593597]])

Эта функция выполнит работу:

def slice_by_five(array):
    argmin = np.argmin(array[:,1])
    if argmin < 5:
        return array[:argmin+6,:]
    return array[argmin-5:argmin+6,:]

check = slice_by_five(anarray)
print(check)

Вывод:

[[0.3897     9.76889121]
 [0.433      9.74167982]
 [0.4763     9.68589645]
 [0.5196     9.59881999]
 [0.5629     9.48861383]
 [0.6062     9.3593597 ]]

Функция, безусловно, может быть обобщена для учета любой окрестности размером n:

def slice_by_n(array, n):
    argmin = np.argmin(array[:,1])
    if argmin < n:
        return array[:argmin+n+1,:]
    return array[argmin-n:argmin+n+1,:]

check = slice_by_n(anarray, 2)
print(check)

Вывод:

[[0.5196     9.59881999]
 [0.5629     9.48861383]
 [0.6062     9.3593597 ]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...