2014-09-27 74 views
2

我有兩個向量,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值的結果嗎?這是行不通的。即使你每個值只使用一個字節,你也需要一個TB的內存。你可以分解它,但這仍然是很多計算。你爲什麼想要這個巨大的差異矩陣?也許有一條更好的路徑來實現你的目標。 – DSM 2014-09-27 16:18:37

+0

我想計算兩個向量的差值,這兩個向量的值具有給定的概率密度函數。問題是其中一個矢量的值低於零,發生4e-6的概率,所以我需要生成1e6個樣本來捕捉它們。但讓我說我「只」需要每個矢量1e4的值,我可以做到嗎? – jpcgandre 2014-09-27 16:22:04

回答

4

你不會對你提到的巨型陣列有很多樂趣。但是,如果你有更合理的尺寸矩陣(小到足以使結果適合內存),最好的方法是使用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]] 
+0

謝謝。作爲一個後續問題:我怎麼能繪製所有'res'值的經驗cdf? – jpcgandre 2014-09-27 16:39:35

+1

@jpcgandre似乎有多個stackoverflow問題已經問起有關同一主題。 [This answer](http://stackoverflow.com/a/3220681/2922139)建議使用['ECDF'](http://statsmodels.sourceforge.net/devel/generated/statsmodels.distributions.empirical_distribution.ECDF。 html)函數在'statsmodels'中。雖然你可能想首先使用['np.ravel'](http://stackoverflow.com/a/3220681/2922139)或['np.flatten'](http:// docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.flatten.html)。 – 2014-09-27 16:43:50