2015-10-05 73 views
1

當計算大型的Numpy數組時,我遇到了奇怪的結果。將大的numpy數組與自身相乘時出現奇怪的結果

A=np.matrix('1 2 3;3 4 7;8 9 6') 
A=([[1, 2, 3], 
    [3, 4, 7], 
    [8, 9, 6]]) 

A * A完成預期的點積:

A*A=([[ 31, 37, 35], 
    [ 71, 85, 79], 
    [ 83, 106, 123]]) 

但具有較大的矩陣200X200我得到不同的迴應:

B=np.random.random_integers(0,10,(n,n)) 
B=array([[ 2, 0, 6, ..., 7, 3, 7], 
    [ 4, 9, 1, ..., 6, 7, 5], 
    [ 3, 1, 8, ..., 7, 3, 8], 
    ..., 
    [ 8, 4, 10, ..., 5, 4, 4], 
    [ 6, 6, 3, ..., 7, 2, 9], 
    [ 2, 10, 10, ..., 5, 7, 4]]) 

現在乘乙爲B

B*B 
array([[ 4, 0, 36, ..., 49, 9, 49], 
    [ 16, 81, 1, ..., 36, 49, 25], 
    [ 9, 1, 64, ..., 49, 9, 64], 
    ..., 
    [ 64, 16, 100, ..., 25, 16, 16], 
    [ 36, 36, 9, ..., 49, 4, 81], 
    [ 4, 100, 100, ..., 25, 49, 16]]) 

我得到每個e lement平方和不是矩陣*矩陣 我做了什麼不同?

+0

'A'是一個數組嗎? – Divakar

+0

是的,希望上述更有意義。 – icypy

回答

4

您似乎使用matrix類型已經創建A,而Bndarray型的(np.random.random_integers返回一個數組,而不是一個矩陣)。運算符*對前者執行矩陣乘法,對後者執行元素乘法。

np.matrixdocumentation

矩陣是一個專門的2-d陣列,其保存通過操作它的2 d的性質。它有一些特殊的運算符,如*(矩陣乘法)和**(矩陣功率)。

順便說一句,如果你在相同的操作使用兩種不同類型,NumPy的將使用屬於具有最高優先級的元素運營商:

>>> A = np.matrix('1 2 3;3 4 7;8 9 6') 
>>> B = np.array(A) # B is of array type, A is of matrix type 
>>> A * B 
matrix([[ 31, 37, 35], 
     [ 71, 85, 79], 
     [ 83, 106, 123]]) 

>>> B * A 
matrix([[ 31, 37, 35], 
     [ 71, 85, 79], 
     [ 83, 106, 123]]) 

>>> A.__array_priority__ 
10.0 
>>> B.__array_priority__ 
0.0 
2

你得到這樣的結果,因爲B是類型numpy.ndarraynumpy.matrix

>>> type(np.random.random_integers(0,10,(n,n))) 
<type 'numpy.ndarray'> 

而是使用

B=np.matrix(np.random.random_integers(0,10,(n,n)))