添加两个数组以使用python创建矩阵的最快方法

时间:2018-11-18 12:19:07

标签: python arrays python-3.x numpy

我有两个麻木的人:

import numpy as np
points_1 = np.array([1.5,2.5,1,3])
points_2 = np.array([3,4])

我想从points_1数组中获取点并从中推导出整个points_2数组以获得矩阵 我想得到

[[-1.5,-2.5]
 [-0.5,-1.5]
 [-2 , -3]
 [0 , -1]]

我知道有一种迭代方法

points = [x - points_2 for x  in points_1] 
points = np.array(points)

但是,此选项不够快。实际上,我正在使用更大的数组。 有更快的方法吗? 谢谢!

5 个答案:

答案 0 :(得分:0)

您只需要选择points_2“更好”(这里更好就是您矩阵的另一个维度),那么它就可以按您期望的那样工作:

因此请不要使用points_2 = np.array([3, 4]),而要使用points_2 = np.array([[3],[4]])

import numpy as np
points_1 = np.array([1.5,2.5,1,3])
points_2 = np.array([[3],[4]])
points = (points_1 - points_2).transpose()

print(points)

结果:

[[-1.5 -2.5]
 [-0.5 -1.5]
 [-2.  -3. ]
 [ 0.  -1. ]]

答案 1 :(得分:0)

如果您一次不整个数组。您可以使用生成器并从惰性评估中受益:

import numpy as np
points_1 = np.array([1.5,2.5,1,3])
points_2 = np.array([3,4])

def get_points():
    def get_points_internal():
        for p1 in points_1:
            for p2 in points_2:
                yield [p1 - p2]

    x = len(points_1) * len(points_2)
    points_1d = get_points_internal()
    for i in range(0, int(x/2)):
        yield [next(points_1d), next(points_1d)]

points = get_points()

答案 2 :(得分:0)

利用numpy的broadcasting功能。这将提供以下内容:

import numpy as np
points_1 = np.array([1.5,2.5,1,3])
points_2 = np.array([3,4])

points = points_1[:, None] - points_2
print(points)

输出:

 [[-1.5 -2.5]
 [-0.5 -1.5]
 [-2.  -3. ]
 [ 0.  -1. ]]

它通过对None索引注入的1维重复操作。有关更多信息,请参见链接。

答案 3 :(得分:0)

您可以一行完成:

np.subtract.outer(points_1,points_2)

向量化非常快。

答案 4 :(得分:0)

您需要使用转置矩阵。

points_1-np.transpose([points_2])

以及您的结果

np.tanspose(points_1-np.transpose([points_2]))