从列表生成矩阵而不使用for循环

时间:2018-07-12 10:41:39

标签: python numpy

我有一个x坐标的numpy数组,想要生成一个数组,该数组显示每个坐标与其他每个坐标之间的距离,即第一行是从每个坐标到第一坐标的距离,第二行是从每个坐标到第二个等。

我当前正在使用两个for循环:

for i in range(len(x_coordinates)): for j in range(len(x_coordinates)): x_relative[i][j] = x_coordinates[j] - x_coordinates[i]

但是有没有迭代的方法吗?有很多座标,所以希望能得到优化。

2 个答案:

答案 0 :(得分:0)

也许使用np.subtract,这样您就可以有一个循环而不是两个循环,因此是O(n)而不是O(n ^ 2):

`import numpy as np
x = [1,2,3,4,5,6,7,8,9] #your coordinates
y = np.array([np.subtract(x,i) for i in x])`

这导致

`>>> y
array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8],
[-1,  0,  1,  2,  3,  4,  5,  6,  7],
[-2, -1,  0,  1,  2,  3,  4,  5,  6],
[-3, -2, -1,  0,  1,  2,  3,  4,  5],
[-4, -3, -2, -1,  0,  1,  2,  3,  4],
[-5, -4, -3, -2, -1,  0,  1,  2,  3],
[-6, -5, -4, -3, -2, -1,  0,  1,  2],
[-7, -6, -5, -4, -3, -2, -1,  0,  1],
[-8, -7, -6, -5, -4, -3, -2, -1,  0]])`

答案 1 :(得分:0)

您需要outer,但要减去。大多数ufunc都内置有外部方法:

x = [1,2,3,4,5,6,7,8,9] #your coordinates


np.subtract.outer(x,x)
array([[ 0, -1, -2, -3, -4, -5, -6, -7, -8],
       [ 1,  0, -1, -2, -3, -4, -5, -6, -7],
       [ 2,  1,  0, -1, -2, -3, -4, -5, -6],
       [ 3,  2,  1,  0, -1, -2, -3, -4, -5],
       [ 4,  3,  2,  1,  0, -1, -2, -3, -4],
       [ 5,  4,  3,  2,  1,  0, -1, -2, -3],
       [ 6,  5,  4,  3,  2,  1,  0, -1, -2],
       [ 7,  6,  5,  4,  3,  2,  1,  0, -1],
       [ 8,  7,  6,  5,  4,  3,  2,  1,  0]])