簡體   English   中英

Numpy:如何使用數組的最后一個維度作為值?

[英]Numpy: How can I use last dimension of an array as a value?

我有一個形狀為[1080, 1920, 4]的 3-D 數組,最后一個軸代表圖片的 RGBA 通道,我有一個從 RGBA 值到 int 的 dict 映射,我想使用np.vectorize來轉換它數組到形狀為[1080, 1920]的二維數組,如何將數組作為二維數組傳遞,最后一維是矢量化 function 的列表?

array = [[[112,  25, 235, 255],
        [112,  25, 235, 255],
        [112,  25, 235, 255],
        ...,
        [ 35,  35,  30, 255],
        [ 41,  40,  37, 255],
        [ 39,  41,  37, 255]]
        ...,
        [ 35,  35,  30, 255],
        [ 41,  40,  37, 255],
        [ 39,  41,  37, 255]]]
dic = {(35,  35,  30, 255): 1, (41,  40,  37, 255): 2}
np.vectorize(lambda x: dic.get(tuple(x)))()

我應該在最后一個()中傳遞什么

使用numpy.apply_along_axis一種方法:

# Data with (3, 3, 4)
array([[[112,  25, 235, 255],
        [112,  25, 235, 255],
        [112,  25, 235, 255]],

       [[ 35,  35,  30, 255],
        [ 41,  40,  37, 255],
        [ 39,  41,  37, 255]],

       [[ 35,  35,  30, 255],
        [ 41,  40,  37, 255],
        [ 39,  41,  37, 255]]])

dic = {(112, 25, 235, 255): 0,
 (35, 35, 30, 255): 1,
 (41, 40, 37, 255): 2,
 (39, 41, 37, 255): 3}

np.apply_along_axis(lambda x: dic.get(tuple(x)), 2, array)

Output:

array([[0, 0, 0],
       [1, 2, 3],
       [1, 2, 3]])

vectorize通常將標量值傳遞給 function。 但是您可以指定signature

In [55]: f=np.vectorize(lambda x: dic.get(tuple(x)),signature='(n)->()')

使用@Chris 示例值:

In [56]: f(arr)
Out[56]: 
array([[0, 0, 0],
       [1, 2, 3],
       [1, 2, 3]])

vectorize警告signature使用速度較慢:

In [57]: timeit f(arr)
178 µs ± 6.38 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

使用apply...就像@Chris 所做的那樣:

In [58]: timeit np.apply_along_axis(lambda x: dic.get(tuple(x)),2, arr)
131 µs ± 1.18 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

以及對“扁平化”數組的列表理解:

In [59]: timeit np.array([dic.get(tuple(x)) for x in arr.reshape(-1,4)]).reshape(ar
    ...: r.shape[:2])
35.3 µs ± 108 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

vectorize的速度劣勢隨着 arrays 的增大而消失,盡管我不知道這是否適用於signature情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM