用numpy执行外部添加

时间:2015-11-21 21:09:27

标签: python numpy

很抱歉,如果这是一个愚蠢的问题,但我刚刚开始使用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],

我可以用它来进行计算。

2 个答案:

答案 0 :(得分:17)

所有带有两个输入参数的通用函数都有一个属性pyinstaller

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)

答案 1 :(得分:10)

许多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} }}。广播沿着单身尺寸“展开”结果,使其具有形状(1, 5)