[英]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.