2015-06-16 305 views
4

我想知道如何計算矩陣元素的元素。例如,矩陣與元素的矩陣元素

import numpy as np 
mat = np.array([[1,2,3],[2,3,4]]) 

np.the_function_i_want(mat) 

將給出矩陣mat2使得mat2[i,j] = mat[i,j]!。我試過類似

np.fromfunction(lambda i,j: np.math.factorial(mat[i,j])) 

但它傳遞整個矩陣作爲參數爲np.math.factorial。我也嘗試使用scipy.vectorize,但對於大於10x10的矩陣,我得到一個錯誤。這是我寫的代碼:

import scipy as sp 
javi = sp.fromfunction(lambda i,j: i+j, (15,15)) 
fact = sp.vectorize(sp.math.factorial) 
fact(javi) 

OverflowError: Python int too large to convert to C long 

這樣的整數會大於2e9,所以我不明白這是什麼意思。

回答

4

有一個在scipy.misc一個factorial功能,其允許在陣列上的逐元素的計算:

>>> from scipy.misc import factorial 
>>> factorial(mat) 
array([[ 1., 2., 6.], 
     [ 2., 6., 24.]]) 

該函數返回浮點值的陣列,因此可以計算「較大」階乘高達精度浮點數允許:

>>> factorial(15) 
array(1307674368000.0) 

如果您想避免以科學計數法顯示數字,您可能需要調整NumPy數組的打印精度。


關於scipy.vectorize:在OverflowError意味着一些計算的結果是太大而無法存儲爲整數(通常int32int64)。

如果你想矢量化sp.math.factorial並且想要任意大的整數,你需要指定該函數返回一個帶有'object'數據類型的輸出數組。例如:

fact = sp.vectorize(sp.math.factorial, otypes='O') 

指定'object'類型允許通過fact返回Python的整數。這些尺寸沒有限制,因此您可以計算與您的計算機的內存允許的尺寸一樣大的尺寸。請注意,這種類型的數組會損失常規NumPy陣列所具有的某些速度和效率優勢。

+0

感謝您的幫助!這非常有用。 –

+0

@JavierGarcia:沒問題!我很高興能夠提供幫助。 –