从两个数组中减去所有值对

3
我有两个向量,v1v2。我想从v1的每个值中减去v2的每个值,并将结果存储在另一个向量中。我还想处理非常大的向量(例如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个所需值。


2
你想要一个有 ~10^6 * 10^6 = 10^12 个值的结果?那是不可能的。即使每个值只使用一个字节,你也需要一太字节的内存。你可以将其分解,但仍需要大量计算。你为什么认为你需要这个巨大的差异矩阵?也许有更好的方法来实现你的目标。 - DSM
我想计算两个向量之间的差异,这些向量的值具有给定的概率密度函数。问题是其中一个向量的值小于零,并且发生的概率为4e-6,因此我需要生成1e6个样本来捕获它们。但假设我“只需要”每个向量1e4个值,我该怎么做? - jpcgandre
2个回答

7

你提到的大型数组可能不太好处理。但是,如果你有更合理大小的矩阵(大小足够小,结果可以放入内存中),最好的方法是使用广播技术。

具体请参考这里

import numpy as np

a = np.array(range(5, 10))
b = np.array(range(2, 6))

res = a[None, :] - b[:, None]
print(res)
# [[3 4 5 6 7]
#  [2 3 4 5 6]
#  [1 2 3 4 5]
#  [0 1 2 3 4]]

谢谢。作为后续问题:我该如何绘制res的所有值的经验CDF图? - jpcgandre
1
@jpcgandre 似乎已经有多个stackoverflow问题询问同一主题。这个答案建议使用statsmodels中的ECDF函数。虽然您可能需要先使用np.ravelnp.flatten将res转换为1-d数组。 - Roger Fan

3

np.subtract.outer

您可以使用np.ufunc.outernp.subtract,然后转置:

a = np.array(range(5, 10))
b = np.array(range(2, 6))

res1 = np.subtract.outer(a, b).T

res2 = a[None, :] - b[:, None]
assert np.array_equal(res1, res2)

这两种方法的性能相当。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接