У меня есть 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)