2011-10-07 66 views
2

我有一個形狀(l,m,n)的數組。我試圖計算形狀(l,m,n)的距離矩陣,其中entry(i,j,k)是向量(i,j,:)和(i,:,k)之間的係數。我沒有發現任何符合法案的numpy或scipy。Numpy,3d陣列的所有成對相關性

我嘗試使用for循環並沿着軸0進行迭代,然後將其饋送到scipy.spatial.distance.pdist,但由於pdist本身使用嵌套for循環需要很長時間。實質上,我想要做的是執行pdist向下的軸0,但理想情況下,它使得pdist不使用for循環。

任何想法?

回答

3

我會親自寫一點Cython函數來做到這一點(http://cython.org)。編寫和測試迭代純Python版本(與環路),它移動到.pyx用Cython文件,添加類型聲明,並按照NumPy的集成指南:

http://docs.cython.org/src/tutorial/numpy.html

似乎是工作,但如果你」使用Python進行計算,一些基本的Cython技能非常值得培養,因爲它使編寫C擴展更容易。

0

有什麼想法?

  1. 首先想到的是,你不能只要計算這樣的距離爲m!= N
  2. 其次想到的是,的pdist內部循環不應該打擾你,如果這些都寫在C,所以可能的原因是不是在執行,但在需要
  3. 最後的思考的計算量,你的問題可能是由numpy.einsum和線性代數來解決:

代碼(我假設是最佳):

products = numpy.einsum('ijl, ilk -> ijk') 
distances = numpy.einsum('ijj -> ij', products) 
distances = distances[:, :, None] + distances[:, None, :] - 2 * product