我有一个存储在元组列表中的索引列表:
index=[(0,0), (0,1), (1,0), (1,1) ....]
这些索引将用于计算图像im
(一个numpy数组)中的能量,如下式所示:
(1-im[0,0])^2+(1-im[0,1])^2+....
im
这是一个二维numpy数组。以下是im
:
im=Image.open('lena_noisy.png')
im=numpy.array(im)
print im
[[168 133 131 ..., 127 213 107]
[174 151 111 ..., 191 88 122]
[197 173 143 ..., 182 153 125]
...,
[ 34 15 6 ..., 111 95 104]
[ 37 15 57 ..., 121 133 134]
[ 49 39 58 ..., 115 74 107]]
如何使用列表的地图功能执行此计算?
答案 0 :(得分:4)
如果您将index
分成两个元组xidx
和yidx
,那么您可以使用花式索引将所有im
值作为一个numpy数组访问。
然后计算变得简单,并且比执行Python循环(或列表推导)更快:
import numpy as np
xidx, yidx = zip(*index)
print(((1-im[xidx, yidx])**2).sum())
import numpy as np
import scipy.misc as misc
im = misc.lena()
n = min(im.shape)
index = np.random.randint(n, size = (10000,2)).tolist()
def using_fancy_indexing(index, im):
xidx, yidx = zip(*index)
return (((1-im[xidx, yidx])**2).sum())
def using_generator_expression(index, im):
return sum(((1 - im[i[0], i[1]]) ** 2) for i in index)
以下是使用timeit的比较:
In [27]: %timeit using_generator_expression(index, im)
100 loops, best of 3: 17.9 ms per loop
In [28]: %timeit using_fancy_indexing(index, im)
100 loops, best of 3: 2.07 ms per loop
因此,根据index
的大小,使用花式索引可能比使用生成器表达式快8倍。
答案 1 :(得分:2)
像这样,使用生成器表达式:
sum((1-im[i][j])**2 for i, j in index)
即,假设im
是二维列表,index
是im
中的坐标列表。请注意,在Python中,二维列表的访问方式如下:m[i][j]
而不是这样:m[i,j]
。
答案 2 :(得分:1)
使用sum
和生成器表达式:
sum(((1 - im[i[0], i[1]]) ** 2) for i in index)
如果index也是一个numpy数组,你可以使用数组作为索引:
sum(((1 - im[i]) ** 2) for i in index)