【问题标题】:Evaluating Python lambda function with numpys np.fromfunction使用 numpys np.fromfunction 评估 Python lambda 函数
【发布时间】:2015-10-21 16:06:08
【问题描述】:

让 A1 和 A2 是相同形状的 numpy 数组,例如 ((d1,d2))。我想从中构建 ((d1,d1)) 数组,以便通过将函数应用于元组 A1[i],A2[j] 来定义其第 [i,j] 个条目。我在表单中使用 np.fromfunction

f=lambda i,j: np.inner(A1[i],A2[j])
A=np.fromfunction(f, shape=(d1, d1)) 

(如Fastest way to initialize numpy array with values given by function 建议的那样)。

但是我收到错误“IndexError:用作索引的数组必须是整数(或布尔)类型”。这很奇怪,因为将 lambda 函数更改为例如

 f=lambda i,j: i*j

工作正常!似乎在 lambda 函数中调用另一个函数会导致

出现问题
np.fromfunction

(np.inner 只是一个示例,我希望能够用其他此类函数替换它)。

【问题讨论】:

    标签: python numpy matrix multidimensional-array


    【解决方案1】:

    要调试这种情况,请将f 设为适当的函数并添加打印语句以查看ij 的值:

    import numpy as np
    np.random.seed(2015)
    d1, d2 = 5, 3
    A1 = np.random.random((d1,d2))
    A2 = np.random.random((d1,d2))
    def f(i, j):
        print(i, j)
        return np.inner(A1[i],A2[j])
    A = np.fromfunction(f, shape=(d1, d1)) 
    

    你会看到(i, j)等于:

    (array([[ 0.,  0.,  0.,  0.,  0.],
           [ 1.,  1.,  1.,  1.,  1.],
           [ 2.,  2.,  2.,  2.,  2.],
           [ 3.,  3.,  3.,  3.,  3.],
           [ 4.,  4.,  4.,  4.,  4.]]), array([[ 0.,  1.,  2.,  3.,  4.],
           [ 0.,  1.,  2.,  3.,  4.],
           [ 0.,  1.,  2.,  3.,  4.],
           [ 0.,  1.,  2.,  3.,  4.],
           [ 0.,  1.,  2.,  3.,  4.]]))
    

    啊哈。问题是这些数组是浮点值的。正如错误消息所说,索引必须是整数或布尔类型。

    查看np.fromfunction 的文档字符串发现它有第三个参数dtype,它控制坐标数组的数据类型:

    Parameters
    dtype : data-type, optional
        Data-type of the coordinate arrays passed to `function`.
        By default, `dtype` is float.
    

    因此解决方案是将dtype=int添加到对np.fromfunction的调用中:

    A = np.fromfunction(f, shape=(d1, d1), dtype=int) 
    

    【讨论】:

    • 对不起,我仍然对使用 'i*j' 作为函数感到困惑,一个得到整数数组 '(i,j)' 而使用 np.inner 得到你写的? 'np.fromfunction' 不应该只将 'f' 应用于作为索引组合(0 到 d1 之间)的所有元组 '(i,j)' 吗?
    • 我不认为np.fromfunction 是用于此目的的正确功能。您会看到索引 ij 的样子。它们是多余的——不需要ijf——因为整个计算都可以用np.inner(A1,A2) 完成。
    • 关于:“不应该 'np.fromfunction' 只将 'f' 应用于所有元组 '(i,j)'” 不,这不是 @987654340 @ 做。 NumPy 中没有执行此操作的函数,因为为每个元组调用 Python 函数 f 对于大型数组来说会非常慢。为了有效地利用 NumPy,您通常希望用最少的必要函数调用来表达计算,并将可能的最大数组传递给这些函数。这将大部分工作卸载到 NumPy 的快速底层 C/Fortran 函数上,并且对较慢的 Python 代码的依赖最少。
    • 不要尝试逐个元素地表达计算(就像在 C 中那样)。而是尝试找到在对整个数组进行操作时实现相同结果的 NumPy 函数。
    • 好的,谢谢!我没有意识到这一点。我刚刚对 np.inner(A1,A2) 与 A[i,j]=np.inner(A1[i],A2[j]) 索引的双循环进行了基准测试,您的解决方案要快得多!
    猜你喜欢
    • 2018-11-05
    • 1970-01-01
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    相关资源
    最近更新 更多