繁体   English   中英

Python列表中的映射

[英]Mapping in Python list

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

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

如何使用列表的地图功能来执行此计算?

如果你将index分成两个元组xidxyidx那么你可以使用花式索引来访问所有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倍。

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

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

也就是说,假设im是二维列表并且indexim中的坐标列表。 请注意,在Python中,二维列表的访问方式如下: m[i][j]而不是这样: m[i,j]

使用sum和生成器表达式:

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

如果index也是一个numpy数组,您可以将该数组用作索引:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM