我有两个麻木的人:
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)
但是,此选项不够快。实际上,我正在使用更大的数组。 有更快的方法吗? 谢谢!
答案 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]))