簡體   English   中英

將大型numpy數組與其自身相乘時,結果很奇怪

[英]Weird results when multiplying large numpy array with itself

在計算大型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*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]])

我得到每個元素的平方,而不是矩陣*矩陣我做了什么不同?

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

np.matrix文檔中:

矩陣是專用的二維數組,可通過操作保留其二維性質。 它具有某些特殊的運算符,例如*(矩陣乘法)和**(矩陣冪)。

順便說一句,如果您在同一操作中使用兩種不同類型,則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

由於B的類型為numpy.ndarray而不是numpy.matrix因此您會得到此結果

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

改為使用

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM