Python:3d numpy数组中的高效搜索

时间:2019-03-07 18:37:19

标签: python numpy search multidimensional-array

我有一个3d numpy数组(shape (z,y,x): 137,601,1200)),并且面临着在每个垂直列中找到最接近500的值的索引的挑战。 例如,我想为数组(:,30,112)找到最接近500的索引。数字从下到上按降序排列。例如,(:,30,112)的137个值中的一些可能如下所示:[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)

0 个答案:

没有答案