Python列表中的映射

Python列表中的映射,python,list,map,Python,List,Map,我有一个存储在元组列表中的索引列表: 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] [

我有一个存储在元组列表中的索引列表:

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]]

如何使用列表的映射功能进行此计算

像这样,使用生成器表达式:

sum((1-im[i][j])**2 for i, j in index)
sum(((1 - im[i[0], i[1]]) ** 2) for i in index)

也就是说,假设
im
是一个二维列表,
index
im
中的坐标列表。请注意,在Python中,二维列表是这样访问的:
m[i][j]
,而不是这样:
m[i,j]
使用
sum
和生成器表达式:

sum((1-im[i][j])**2 for i, j in index)
sum(((1 - im[i[0], i[1]]) ** 2) for i in index)
如果索引也是numpy数组,则可以将该数组用作索引:

sum(((1 - im[i]) ** 2) for i in index)

如果将
index
分成两个元组,
xidx
yidx
,则可以使用奇特的索引将所有
im
值作为一个numpy数组访问。 然后,计算变得易于表达,并且比执行Python循环(或列表理解)更快:


以下是使用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

因此,根据
索引的大小,使用奇特的索引可能比使用生成器表达式快8倍。

这是一个二维numpy数组,类似于查找表。值得注意的是,您可以在迭代过程中解压元组,而不是索引:
求和((1-im[i][j])**2表示索引中的i,j)
@Blckknght你是对的,这更清楚了。我更新了我的答案,谢谢!