【问题标题】:performing outer addition with numpy用 numpy 执行外部加法
【发布时间】:2015-11-21 21:09:27
【问题描述】:

对不起,如果这是一个愚蠢的问题,但我刚刚开始使用 python/numpy,我真的不确定最有效的处理方式。我正在为一些学生组装一个演示 N 体模拟器,但现在,我正在通过循环这些粒子的位置来计算粒子之间的力,这些粒子的位置可以预见地像糖蜜一样慢。基本上,给定一个向量x[i],我想计算:

n[i] = sum from j = 0 to n-1, j != i of (x[i]-x[j])^-2,

使用 numpy 函数而不是循环。如果有办法执行外部加法/乘法:

m[i,j] = x[i]-x[j],

m[i,j] = x[i]*x[j],

我可以用它来进行计算。

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    所有接受两个输入参数的通用函数都有一个属性outer

    x = np.array([1, 2, 3])
    np.subtract.outer(x, x)
    

    给予:

    array([[ 0, -1, -2],
           [ 1,  0, -1],
           [ 2,  1,  0]])
    

    np.multiply.outer(x, x)
    

    结果:

    array([[1, 2, 3],
           [2, 4, 6],
           [3, 6, 9]])
    

    【讨论】:

    • 这是一个很棒的功能!对于那些感兴趣的人,可以在ufunc documentation 上进一步阅读。
    • 我很想知道这个outer 操作是否在数学中获得了名称(或者名称是否随操作符而变化,例如multiply 的“外积”)。
    【解决方案2】:

    许多 numpy 的基本运算符,例如 np.addnp.subtractnp.multiply 等都被称为 universal functions (ufuncs),并且有(除其他外).outer 方法:

    import numpy as np
    a = np.arange(3)
    b = np.arange(5)
    c = np.add.outer(a, b)
    print(repr(c))
    # array([[0, 1, 2, 3, 4],
    #        [1, 2, 3, 4, 5],
    #        [2, 3, 4, 5, 6]])
    

    另一个非常强大的技术是broadcasting

    print(repr(a[:, None] + b[None, :]))
    # array([[0, 1, 2, 3, 4],
    #        [1, 2, 3, 4, 5],
    #        [2, 3, 4, 5, 6]])
    

    使用None(或使用np.newaxis)进行索引会插入一个新维度,因此a[:, None] 的形状为(3, 1)b[None, :] 的形状为(1, 5)。广播沿单例维度“扩展”结果,使其具有形状(3, 5)

    【讨论】:

    猜你喜欢
    • 2013-08-07
    • 1970-01-01
    • 2012-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-18
    • 1970-01-01
    相关资源
    最近更新 更多