内部尺寸为零的numpy点积给出了意外的结果

内部尺寸为零的numpy点积给出了意外的结果,numpy,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

我的计算包括将许多矩阵放在一个大的块矩阵中。在某些情况下,其中一些矩阵可能为空。这些空矩阵给出了意外的结果

问题归结为:

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.]方程添加了一个不正确的方程。我宁愿不这样做。

坏消息是,结果的形状是预期的和正确的

好消息是,使用
size
属性提供的结果中的元素总数,可以进行一次几乎微不足道的检查,查看矩阵在所有情况下是否为空:

b = ...
X = ...
Y = array([]).dot(X)
if Y.size:
    # You have a non-empty result
编辑

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

if b.size and X.size:
    Y = b.dot(X)
    # Add Y to your block matrix, knowing that it is of the expected size

(1x0)。(0x3)->[[0,0,0]]是正确的行为,因为生成的形状与内部尺寸无关,并且0是加法标识。你能详细解释一下为什么这会给你带来问题吗?
X.size==0
=>你不需要检查所有可能的组合。这是检查矩阵是否为空的简单方法。@JeroenBlofs。我做了一个更新。如果有帮助,请告诉我。如果你想在你的问题上得到一些真正的帮助,那么你可以看到更多的代码摘要。我应该澄清我的意思,我不想检查零维。我放在块矩阵中的方程由这些点积的百分之一组成。每个点积表示电气网络中的一个组件
X
为空表示网络中不存在此类组件。但是如果我必须根据呈现的元素组成最终(块)矩阵。那么这就意味着需要数千行代码。因为[0,0,0.]方程添加了一个不正确的方程。我宁愿不这样做。再补充一点。Matlab的行为是正确的,因为空数组
array([])
被视为大小
0x0
,这将通过遵循点积规则生成空数组。
y=np。零((0,0))
应与Matlab中的一样工作。如果要仿真MATLAB,请确保阵列的二维尺寸一致。在倍频程
中,零(1,0)*x产生一个(1,3)矩阵。