In [17]: [dct[i] for i in index]
Out[17]: [40, 30, 20, 10]
整数索引比循环中的dict查找快得多:
In [19]: %timeit arr[index]
1000000 loops, best of 3: 201 ns per loop
In [20]: %timeit [dct[i] for i in index]
1000000 loops, best of 3: 1.63 µs per loop
def rgb2int(arr):
"""
Convert (N,...M,3)-array of dtype uint8 to a (N,...,M)-array of dtype int32
"""
return arr[...,0]*(256**2)+arr[...,1]*256+arr[...,2]
def rgb2vals(color, color2ind):
int_colors = rgb2int(color)
int_keys = rgb2int(np.array(color2ind.keys(), dtype='uint8'))
int_array = np.r_[int_colors.ravel(), int_keys]
uniq, index = np.unique(int_array, return_inverse=True)
color_labels = index[:int_colors.size]
key_labels = index[-len(color2ind):]
colormap = np.empty_like(int_keys, dtype='uint32')
colormap[key_labels] = color2ind.values()
out = colormap[color_labels].reshape(color.shape[:2])
return out
print(rgb2vals(color, color2ind))
收益率
[[0 1]
[2 3]
[4 5]
[6 7]]
(数字是按顺序排列的;color被选中,所以答案很容易检查。)
这是一个基准测试,显示使用NumPy索引的rgb2vals要快得多
而不是使用双for循环:
def using_loops(color, color2ind):
M, N = color.shape[:2]
out = np.zeros((M, N))
for i in range(M):
for j in range(N):
out[i][j] = color2ind[tuple(color[i,j,:])]
return out
In [295]: color = np.tile(color, (100,100,1))
In [296]: (rgb2vals(color, color2ind) == using_loops(color, color2ind)).all()
Out[296]: True
In [297]: %timeit rgb2vals(color, color2ind)
100 loops, best of 3: 6.74 ms per loop
In [298]: %timeit using_loops(color, color2ind)
1 loops, best of 3: 751 ms per loop
dict是从键到值的映射。NumPy数组也可以用作 价值观的关键。例如
dict更灵活,它的键可以是任何散列对象。阵列 必须用整数索引。但阵列可能更适合于纽姆比 设置,因为数组本身可以由整数数组索引:
^{pr2}$而使用dict的等价物需要一个循环:
整数索引比循环中的dict查找快得多:
dicts和NumPy数组之间的这种粗略的等价性是 激发下面的方法。剩下的代码就是要克服的 例如没有整数键(您将看到这是通过使用
np.unique
的return_inverse=True
以获得唯一的整数标签。)假设您有这样的设置:
然后:
收益率
(数字是按顺序排列的;
color
被选中,所以答案很容易检查。)这是一个基准测试,显示使用NumPy索引的rgb2vals要快得多 而不是使用双for循环:
第一步是通过将每个(r,g,b)三元组转换为单个int,将
color
缩减为二维数组:现在我们对
color2ind
dict中的(r,g,b)三元组键执行相同的操作:将这两个数组串联起来,然后使用
np.unique
来查找反向索引:uniq
保存int_colors
和int_keys
中的唯一值。index
保存索引值,这样uniq[index] = int_array
:一旦我们有了}中键的标签。在
index
,我们就是黄金。index
中的值类似于标签,每个标签都与特定的颜色相关联。index
中的第一个color.size
项是color
中颜色的标签,index
中最后一个len(color2ind)
项是{现在我们只需要用
color2ind.values()
中的值创建一个数组,colormap
,这样键标签就映射到这些值:通过将
color2ind
中的值放在与 关联键标签,我们创建一个colormap数组,它可以有效地执行 就像dict一样,colormap[color_labels]
将颜色标签映射到color2ind
值,这正是我们想要的:通过使用逻辑索引,您将获得更快的结果。这里有一种方法可以实现:
注意:它假设数组中的值只有0和128,这两个值会出现在您自己的代码和color2ind映射中。在
编辑:阿巴内特的评论是正确的。索引
m x n x 3
数组仍然非常快速,并且可能比这种彩色编码的2D数组更适合进一步的图像处理。不过,如果这真的是你想要的,这不是一个糟糕的方法。在相关问题 更多 >
编程相关推荐