【问题标题】:np.vectorize giving me IndexError: invalid index to scalar variablenp.vectorize 给我 IndexError: invalid index to scalar variable
【发布时间】:2015-12-03 11:53:37
【问题描述】:

尝试一些简单的东西却令人沮丧地不起作用:

def myfunc(a,b):
  return a+b[0]

v = np.vectorize(myfunc, exclude=['b'])

a = np.array([1,2,3])
b = [0]

v(a,b)

这给了我“IndexError:标量变量的无效索引”。 在打印 b 时,函数输入的 b 似乎始终为 0,而不是 [0]。我可以指定哪些参数应该被向量化,哪些应该保持不变?

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    当您使用excluded=['b'] 时,关键字 参数b 被排除在外。 因此,您必须使用关键字参数调用v,例如v(a=a, b=b) 而不是 v(a, b)

    如果您希望使用排除第二个位置参数的位置参数调用v,请使用

    v = np.vectorize(myfunc)
    v.excluded.add(1)
    

    例如,

    import numpy as np
    
    def myfunc(a, b):
        return a+b[0]
    
    a = np.array([1,2,3])
    b = [0, 1]
    
    v = np.vectorize(myfunc, excluded=['b'])
    print(v(a=a, b=b))
    # [1 2 3]
    
    v = np.vectorize(myfunc)
    v.excluded.add(1)
    print(v(a, b))
    # [1 2 3]
    

    【讨论】:

    • 谢谢!我已经发现了这一点,但是我将您的答案标记为对将来遇到此问题的任何人都是正确的。我遇到了一些奇怪的事情:当我用上述函数尝试类似 v(a, b) 的东西时,由于某种原因,它需要两次 a 的第一个元素。就像 1+1+2+3 或 0+0+1+2 而不是 1+2+3 或 0+1+2。知道发生了什么吗?
    • np.vectorize 调用函数一次(额外)时间来确定输出类型。您可以通过指定 otypes 来避免这种情况。
    • 谢谢!我应该更详细地阅读文档,记住类似的内容。
    【解决方案2】:

    这就是答案:

    v.excluded.add(1) 有效,尽管由于某种原因传递 exclude=['b'] 无效。

    【讨论】:

      【解决方案3】:

      只需添加 print 看看会发生什么:

      def myfunc(a, b):
          print(a, b)
          return a + b
      
      v = np.vectorize(myfunc)
      
      a = np.array([1,2,3])
      b = np.array([0])
      v(a, b)
      

      输出:

      1 0
      1 0
      2 0
      3 0
      

      该函数应用于数组的所有元素。所以它只接收标量值。您不能索引标量。

      【讨论】:

      • 我已经知道 b 被视为 0 而不是前面提到的 [0]。解决方案是添加 v.excluded.add(1),但我猜是感谢您的参与。
      猜你喜欢
      • 2021-06-15
      • 1970-01-01
      • 2019-12-11
      • 1970-01-01
      • 2016-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多