关于python:numpy数组上的lambda函数。

lambda function on a numpy array. What's wrong with this piece of code?

此代码有什么问题:

将numpy导入为np

1
2
3
4
5
6
A = np.array([[-0.5, 0.2, 0.0],
          [4.2, 3.14, -2.7]])

asign = lambda t: 0 if t<0 else 1
asign(A)
print(A)

预期:

1
2
     [[0.  1.  0.]
      [ 1.  1. 0.]]

值错误:具有多个元素的数组的真值不明确。使用a.any()或a.all()。


嗯,lambda本身不会通过整个数组。为此,你需要一个高阶函数。在这种情况下:地图。

1
2
3
4
5
A = np.array([[-0.5, 0.2, 0.0],
              [4.2, 3.14, -2.7]])

asign = lambda t: 0 if t<0 else 1
A = list(map(asign, A))

map将遍历每个元素并通过函数传递它。我将映射包装在一个列表中,因为它返回一个类型为filter的对象,但您可以这样转换它。


您可以使用lambda,但是numpy数据类型允许您执行许多"matlab类型"的操作(对于那些习惯了这种操作的人):

  • Python:

    1
    2
    3
    a = np.array([1, 2, 3, 4, 5])
    ((a > 1) & (a < 3)).astype(int)
    # array([0, 1, 0, 0, 0])
  • 倍频程/ MATLAB

    1
    2
    3
    4
    5
    a = [1,2,3,4,5];
    a>1 & a<3
    % ans =
    %
    %  0  1  0  0  0


这对我很有用:

1
A = A.clip(min=0, max=1)