2013-06-26 46 views
4

我可以sum沿特定的軸的所有元素,使用numpy.sum,即'沿特定軸'操作如何實施?

>>> a = numpy.array([[1,2], [3,4]]) 
>>> numpy.sum(a, 1) 
array([3, 7]) 

sum along row,其通過一個添加的每個列中的一個的元件。

如果只有2或3個軸,我可以在C/C++中使用if...elifswith...case來實現,但如果有100個軸呢?如何實現它?

+1

你想要什麼來實現? – joris

+3

numpy數組只是引擎蓋下的一維C數組,因此沿着單個軸的跳躍是通過跳過C數組來實現的。因此,您必須計算與該軸對應的步幅,然後在計算總和時逐步通過陣列。 – Evert

+1

另外,從Python中,您可以使用'np.rollaxis'將第n個軸移動到開頭,並僅爲第一個維度實現它。 – jorgeca

回答

2

Numpy數組只是一維C數組,所以沿着單個軸的跳躍是通過跳過C數組來實現的,步幅的大小取決於您要迭代的維數(最小跨越最快的維度,在Python/C將是最後一個維度)。

所以,你將不得不以計算對應於所述軸線的步幅,然後通過陣列步驟而計算的總和。對於每個總和,您從數組中的偏移量開始(第一個將爲0),並以另一個步長增加。

如果您想了解更多,可以閱讀guide to numpy的第15章(無需真正需要讀取以前的所有內容),該章從關於numpy數組迭代的一節開始,因爲它在C中完成。

+0

Upvoted,而且,我發現大部分的'numpy'和核心方法''用C/C,如'convolve'和'correlate' scipy'實際上++實現的',這是爲什麼?性能問題?如果使用PURE'python'代碼實現它們會怎麼樣? – Alcott

+0

@Alcott:這是numpy和scipy的全部觀點:性能。只有當你去喜歡PyPy路線你可能會得到同樣的速度爲原生的C程序,但往往只針對一些特定的操作(我沒有試過落實各項的更看中numpy的/ SciPy的程序在純Python與PyPy,然後比較)。使用純Python和普通CPython通常會讓你減速100倍。 – Evert

+0

@alcott:另外,代碼重用。這裏有很多代碼,針對速度進行了優化,主要是C或FORTRAN。 Numpy和scipy接口與一些這樣的庫(或者至少可以),比如標準線性代數(BLAS,LAPACK)例程。他們沒有試圖重新發明輪子,而是提供了一個Pythonic接口,用於經過優化(和調試!)並經過多年驗證的產品。 – Evert