2015-10-05 30 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)))