代码之家  ›  专栏  ›  技术社区  ›  telliott99

矢量化不确定

  •  1
  • telliott99  · 技术社区  · 15 年前

    我试图在numpy中对一个简单函数进行矢量化,得到不一致的行为。我希望我的代码为值返回0<0.5,否则取不变值。奇怪的是,从命令行运行不同的脚本会产生不同的结果:有时它工作正常,有时我得到所有0。当d<=T它似乎与返回的第一个值是否为0有关。有什么想法吗?谢谢

    import numpy as np
    
    def my_func(d, T=0.5):
        if d > T:   return d
        #if d <= T:  return 0
        else:  return 0
        #return 0
    
    N = 4
    A = np.random.uniform(size=N**2)
    A.shape = (N,N)
    print A
    f = np.vectorize(my_func)
    print f(A)
    
    $ python x.py
    [[ 0.86913815  0.96833127  0.54539153  0.46184594]
     [ 0.46550903  0.24645558  0.26988519  0.0959257 ]
     [ 0.73356391  0.69363161  0.57222389  0.98214089]
     [ 0.15789303  0.06803493  0.01601389  0.04735725]]
    [[ 0.86913815  0.96833127  0.54539153  0.        ]
     [ 0.          0.          0.          0.        ]
     [ 0.73356391  0.69363161  0.57222389  0.98214089]
     [ 0.          0.          0.          0.        ]]
    $ python x.py
    [[ 0.37127366  0.77935622  0.74392301  0.92626644]
     [ 0.61639086  0.32584431  0.12345342  0.17392298]
     [ 0.03679475  0.00536863  0.60936931  0.12761859]
     [ 0.49091897  0.21261635  0.37063752  0.23578082]]
    [[0 0 0 0]
     [0 0 0 0]
     [0 0 0 0]
     [0 0 0 0]]
    
    1 回复  |  直到 15 年前
        1
  •  7
  •   Andrew Jaffe    15 年前

    如果这确实是您想要解决的问题,那么有一个更好的解决方案:

    A[A<=0.5] = 0.0
    

    但是,代码的问题是,如果条件通过,则返回 整数 0,不是 浮动

    的输出的数据类型 vectorized 通过使用输入的第一个元素调用函数来确定。可以通过指定 otypes

    所以当第一个入口 <0.5 ,它尝试创建一个整数数组,而不是浮点数组。 你应该改变 return 0

    return 0.0
    

    my_func ,您可以使用

    f = np.vectorize(my_func, otypes=[np.float])