Python: эффективный поиск в массиве 3d numpy - PullRequest
0 голосов
/ 07 марта 2019

У меня есть 3-й массив NumPy (shape (z,y,x): 137,601,1200)), и я сталкиваюсь с проблемой нахождения индекса значения, которое ближе всего к 500 в каждом вертикальном столбце.Например, я хотел бы найти индекс, который ближе всего к 500 для массива (:,30,112).Числа упорядочены снизу вверх в порядке убывания.Например, некоторые из 137 значений (:,30,112) могут выглядеть следующим образом: [1033.91 1031.35 ... 0.01].

Мой первый подход - применить функцию поиска по каждому вертикальному столбцу с помощью цикла for.Но я уверен, что должен быть более быстрый путь!Вот моя первая попытка:

from bisect import bisect_left

def takeClosest(myList, myNumber):

    pos = bisect_left(myList, myNumber)
    if pos == 0:
        return 0
    if pos == len(myList):
        return -1
    before = myList[pos - 1]
    after = myList[pos]
    if after - myNumber < myNumber - before:
       return pos
    else:
       return pos-1


def calcOptK(tnsr):
    # 2d array which saves the optimal levels
    optKs = np.zeros([601,1200])
    #iterate through the tensor and call on each point the search function    
    for y in range (0, 601):
        for x in range (0, 1200):
            optKs[y,x]=136-takeClosest(p3d[:,y,x][::-1],500)
    return optKs; 

optKs=calcOptK(p3d)

ОБНОВЛЕНИЕ : Благодаря @hpaulj и @Mstaino.Это прекрасно работает:

optKs = np.argmin(np.abs(p3d-500), axis=0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...