Python Numpy矩阵乘法返回nan
我有两个二维矩阵,我想把这两个矩阵相乘,得到一个新的矩阵。第一个矩阵A的尺寸为943 x 1682,如下所示:Python Numpy矩阵乘法返回nan,python,arrays,numpy,matrix,vector,Python,Arrays,Numpy,Matrix,Vector,我有两个二维矩阵,我想把这两个矩阵相乘,得到一个新的矩阵。第一个矩阵A的尺寸为943 x 1682,如下所示: [[ 5. 3. 4. ..., 0. 0. 0.] [ 4. 0. 0. ..., 0. 0. 0.] [ 0. 0. 0. ..., 0. 0. 0.] ..., [ 5. 0. 0. ..., 0. 0. 0.] [ 0. 0. 0. ..., 0. 0. 0.] [ 0. 5. 0. ..., 0. 0.
[[ 5. 3. 4. ..., 0. 0. 0.]
[ 4. 0. 0. ..., 0. 0. 0.]
[ 0. 0. 0. ..., 0. 0. 0.]
...,
[ 5. 0. 0. ..., 0. 0. 0.]
[ 0. 0. 0. ..., 0. 0. 0.]
[ 0. 5. 0. ..., 0. 0. 0.]]
[[ 0. 0. 0. ..., 0. 0. 3. ]
[ 0. 0.57735027 0.57735027 ..., 0. 0. 3. ]
[ 0. 0. 0. ..., 0. 0. 1. ]
...,
[ 0. 0. 0. ..., 0. 0. 2. ]
[ 0. 0. 0. ..., 0. 0. 1. ]
[ 0. 0. 0. ..., 0. 0. 1. ]]
[[ nan nan nan ..., nan nan nan]
[ nan nan nan ..., nan nan nan]
[ nan nan nan ..., nan nan nan]
...,
[ nan nan nan ..., nan nan nan]
[ nan nan nan ..., nan nan nan]
[ nan nan nan ..., nan nan nan]]
另一个矩阵B的尺寸为1682 x 20,如下所示:
[[ 5. 3. 4. ..., 0. 0. 0.]
[ 4. 0. 0. ..., 0. 0. 0.]
[ 0. 0. 0. ..., 0. 0. 0.]
...,
[ 5. 0. 0. ..., 0. 0. 0.]
[ 0. 0. 0. ..., 0. 0. 0.]
[ 0. 5. 0. ..., 0. 0. 0.]]
[[ 0. 0. 0. ..., 0. 0. 3. ]
[ 0. 0.57735027 0.57735027 ..., 0. 0. 3. ]
[ 0. 0. 0. ..., 0. 0. 1. ]
...,
[ 0. 0. 0. ..., 0. 0. 2. ]
[ 0. 0. 0. ..., 0. 0. 1. ]
[ 0. 0. 0. ..., 0. 0. 1. ]]
[[ nan nan nan ..., nan nan nan]
[ nan nan nan ..., nan nan nan]
[ nan nan nan ..., nan nan nan]
...,
[ nan nan nan ..., nan nan nan]
[ nan nan nan ..., nan nan nan]
[ nan nan nan ..., nan nan nan]]
但是,当我尝试A.dot(B)或np.matmul(A,B)时,我得到了一个新的矩阵,其值均为nan,如下所示:
[[ 5. 3. 4. ..., 0. 0. 0.]
[ 4. 0. 0. ..., 0. 0. 0.]
[ 0. 0. 0. ..., 0. 0. 0.]
...,
[ 5. 0. 0. ..., 0. 0. 0.]
[ 0. 0. 0. ..., 0. 0. 0.]
[ 0. 5. 0. ..., 0. 0. 0.]]
[[ 0. 0. 0. ..., 0. 0. 3. ]
[ 0. 0.57735027 0.57735027 ..., 0. 0. 3. ]
[ 0. 0. 0. ..., 0. 0. 1. ]
...,
[ 0. 0. 0. ..., 0. 0. 2. ]
[ 0. 0. 0. ..., 0. 0. 1. ]
[ 0. 0. 0. ..., 0. 0. 1. ]]
[[ nan nan nan ..., nan nan nan]
[ nan nan nan ..., nan nan nan]
[ nan nan nan ..., nan nan nan]
...,
[ nan nan nan ..., nan nan nan]
[ nan nan nan ..., nan nan nan]
[ nan nan nan ..., nan nan nan]]
我想这可能是乘以0的结果。但为什么它会在每个位置返回nan?我应该如何处理这个问题,这样我就可以得到数字而不是nan
非常感谢你的帮助 第一个矩阵中的单个
nan
列和\或第二个矩阵中的单个nan
行可能导致此问题。验证两个矩阵中所有值是否都有效的一种方法是过滤掉nan
s并查看形状是否保持不变:
a_shape_before = A.shape
a_shape_after = A[numpy.logical_not(numpy.is_nan(A))].shape
assert a_shape_before == a_shape_after
同样,对于B.来说,如果您试图将矩阵简化为再现问题的最小可能版本,则可能会有所帮助(那么您可能也找到了解决方案……)。在未打印的部分中是否存在
nan
s?@hiroprogator不幸的是,这些是简化矩阵。我想我找到了一些nan
s。那么,在我将所有的nan
s转换为0
之后,它会工作吗?我不能保证这会给出正确的/期望的结果,但是nan
s应该会消失。对于reduced,我的意思是:尝试找到最小的矩阵(它们不需要有任何意义)来重现您的问题(即,在点积下产生nan
s)。谢谢。返回(31920,)后的形状是否意味着矩阵中存在一些nan,因为31920<1682*20?是的。A中的单个nan
列可能导致此问题。使用numpy.argwhere(numpy.isnan(A))
查找矩阵中nan
s的索引。