在lambda函数中设置numpy切片

2 投票
1 回答
3403 浏览
提问于 2025-04-15 16:51

我想创建一个lambda函数,这个函数接收两个numpy数组,把第一个数组的一部分设置为第二个数组的内容,然后返回这个新设置的numpy数组。

考虑到在lambda函数里不能直接赋值,有没有什么方法可以做到类似的事情呢?

这里的背景是,我想在一行代码中把一个全是零的数组的中心部分设置为另一个数组,而我想到的唯一解决办法就是使用reduce和lambda函数。

也就是说,我在想把这个(假设b是给定的):

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

压缩成一行代码。这样做可能吗?这只是一个关于一行代码的练习。我已经有了能实现我想要功能的代码,我只是出于好玩想知道这个。

1 个回答

4

这个写法不好,建议不要用。不过这是你要求的单行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__() 返回 None?

在Python中,有个通用的约定是,像 list.extend()list.append() 这些会直接修改对象的方法,应该返回 None。当然也有例外,比如 list.pop()

Python中的Y组合子

这里有一篇博客文章 关于写Python单行代码,它展示了如何使用 lambda 写无名递归函数(这个链接是 @Peter Hansen 推荐的)。

撰写回答