在lambda函数中设置numpy切片

时间:2009-12-09 22:40:55

标签: python lambda numpy

我想创建一个lambda函数,该函数接受两个numpy数组并将第一个切片设置为第二个并返回新设置的numpy数组。

考虑到你无法在lambda函数中分配东西,有没有办法做类似的事情呢?

这个的上下文是我想在一行中将零数组的中心设置为另一个数组,而我能想到的唯一解决方案是使用reduce和lambda函数。

即。我正在考虑这种情况的凝结(给出b):

a = numpy.zeros( numpy.array(b.shape) + 2)
a[1:-1,1:-1] = b

成一行。这可能吗? 这只是oneliners的练习。我有代码做我想做的事情,我只是想知道它的乐趣:)。

1 个答案:

答案 0 :(得分:4)

这很丑陋;你不应该使用它。但正如你所问,它是oneline lambda:

f = lambda b, a=None, s=slice(1,-1): f(b, numpy.zeros(numpy.array(b.shape) + 2))\
                      if a is None else (a.__setitem__([s]*a.ndim, b), a)[1]

什么是__setitem__

在这种情况下,

obj.__setitem__(index, value)相当于obj[index] = value。例如:

class A:
    def __setitem__(self, index, value):
       print 'index=%s, value=%s' % (index, value)

a = A()
a[1, 2] = 3

打印:

index=(1, 2), value=3

为什么__setitem__()会返回无?

Python中有一个通用惯例,即list.extend()list.append()等就地修改对象的方法应该返回None。有例外,例如list.pop()

Python中的Y Combinator

以下是博文On writing Python one-liners,其中显示了如何使用lambda编写无名递归函数(该链接由@Peter Hansen建议)。