【问题标题】:lambda function on a numpy array. What's wrong with this piece of code?numpy 数组上的 lambda 函数。这段代码有什么问题?
【发布时间】:2018-11-15 00:11:18
【问题描述】:

这段代码有什么问题:

将 numpy 导入为 np

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)

预期:

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

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

【问题讨论】:

  • 您希望np.array([[-0.5, 0.2, 0.0], [4.2, 3.14, -2.7]]) &lt; 0 的答案是什么? Python 不知道如何处理这种比较。
  • 尝试比较A &lt; 0。这是没有意义的。我想你想要B = [assign(a) for a in x for x in A] 之类的东西。
  • A&lt;0 生成一个与A 大小相同的布尔数组。 Python if 仅适用于标量布尔 True/False。这是一个简单的非此即彼的行动。它不能与多个布尔值一起使用。
  • 谢谢。我使用剪辑和 np.sign() 实现
  • 注意,lambda 函数并不真正相关。在任何情况下,如果您要将匿名函数分配给一个名称,您应该只使用常规函数定义。

标签: python numpy lambda


【解决方案1】:

好吧,lambda 本身不会遍历整个数组。为此,您将需要一个更高阶的函数。在这种情况下:地图。

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 将遍历每个元素并将其传递给函数。 我将 map 包装在一个列表中,因为它返回一个 map 类型的对象,但您可以通过这种方式对其进行转换。

【讨论】:

    【解决方案2】:

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

    • 蟒蛇:

      a = np.array([1, 2, 3, 4, 5])
      ((a > 1) & (a < 3)).astype(int)
      # array([0, 1, 0, 0, 0])
      
    • 八度/matlab

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

    【讨论】:

      【解决方案3】:

      这对我有用:

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

      【讨论】:

      • 你为什么要这样做?只需使用(A &gt; 0).astype(int)
      猜你喜欢
      • 1970-01-01
      • 2012-05-20
      • 2022-11-01
      • 1970-01-01
      • 2020-08-02
      • 1970-01-01
      • 2015-04-25
      • 2018-09-09
      相关资源
      最近更新 更多