内部尺寸为零的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)矩阵。