我有两个向量,v1
和v2
。我想从v2
的每个值中减去v1
的每个值,并将结果存储在另一个向量中。我也想使用非常大的向量(例如1e6大小),所以我认为我应该使用numpy来表现。
到目前为止,我有:
import numpy
v1 = numpy.array(numpy.random.uniform(-1, 1, size=1e2))
v2 = numpy.array(numpy.random.uniform(-1, 1, size=1e2))
vdiff = []
for value in v1:
vdiff.extend([value - v2])
这将创建一个包含100个条目的列表,每个条目都是100的数组。但我不知道这是否是最有效的方法。 我想用尽可能小的物体尺寸(记忆)来非常快速地计算出1e4的期望值。
答案 0 :(得分:5)
你提到的巨型阵列不会带来很多乐趣。但是如果你有更合理大小的矩阵(足够小以至于结果可以适合内存),最好的方法是使用broadcasting。
import numpy as np
a = np.array(range(5, 10))
b = np.array(range(2, 6))
res = a[np.newaxis, :] - b[:, np.newaxis]
print(res)
# [[3 4 5 6 7]
# [2 3 4 5 6]
# [1 2 3 4 5]
# [0 1 2 3 4]]
答案 1 :(得分:1)
np.subtract.outer
您可以将np.ufunc.outer
与np.subtract
一起使用,然后转置:
a = np.array(range(5, 10))
b = np.array(range(2, 6))
res1 = np.subtract.outer(a, b).T
res2 = a[np.newaxis, :] - b[:, np.newaxis]
assert np.array_equal(res1, res2)
两种方法的性能相当。