内部维度为零的numpy dot产品会产生意外结果

时间:2017-07-24 13:38:42

标签: numpy

我的计算包括将许多矩阵放在一个大块矩阵中。在某些情况下,这些矩阵中的一些可能是空的。这些空矩阵会产生意想不到的结果。

问题归结为:

b
Out[117]: array([], dtype=int32)

X = A[b,:]
Out[118]: array([], shape=(0, 3), dtype=float64)

X是空矩阵。由于代码,它乘以的矩阵也是空的。

Y = array([]).dot(X)
Out[119]: array([ 0.,  0.,  0.])

根据代数我意识到Y的大小是正确的:(1x0)。(0x3)=(1x3)。但我期待结果是一个空矩阵,因为矩阵的内部维数为零(不是一个),

我宁愿不检查这些矩阵是否为空,因为将块矩阵放在一起,必须为每个可能的空矩阵组合重写。

这个问题有解决方法吗?我想要包装点函数,只在内部维度不为零的情况下进行处理。但我觉得有一个更清洁的解决方案。

编辑: 我应该用我的意思澄清一点,我宁愿不检查零维度。我放入块矩阵的方程由这些点积的数量组成。每个点积表示电网中的组件。 X为空意味着网络中不存在此类组件。但是如果我必须根据呈现的元素来组成最终(块)矩阵。那么这将意味着数千行代码。因为[0.,0.,0。]等式增加了一个不正确的等式。我宁愿不这样做。

1 个答案:

答案 0 :(得分:0)

坏消息是结果的形状既是预期的又是正确的。

好消息是,使用{{1}提供的结果中的元素总数,对所有案例中的矩阵是否为空是一个近乎无关紧要的检查} attribute:

<customErrors mode="Off">
</customErrors>
<compilation debug="false" />

修改

您可以使用相同的逻辑来过滤输入向量。由于您只想对非空向量进行计算,因此您可能需要尝试类似:

size