Python 如何确保numpy中没有单例扩展
从MATLAB到NumPy,二维数组之间的区别,其中一个维度等于1到1D数组,这令人恼火 例如:Python 如何确保numpy中没有单例扩展,python,numpy,Python,Numpy,从MATLAB到NumPy,二维数组之间的区别,其中一个维度等于1到1D数组,这令人恼火 例如: >>>import numpy as np >>>x1 = np.array([[1],[2],[3]]) >>>x2 = np.array([1,2,3]) >>>x1.shape (3, 1) >>>x2.shape (3,) 因此,当使用元素级产品时,我得到3X3矩阵: >>>x1 *
>>>import numpy as np
>>>x1 = np.array([[1],[2],[3]])
>>>x2 = np.array([1,2,3])
>>>x1.shape
(3, 1)
>>>x2.shape
(3,)
因此,当使用元素级产品时,我得到3X3矩阵:
>>>x1 * x2
array([[1, 2, 3],
[2, 4, 6],
[3, 6, 9]])
但我真正想要的是
>>>np.squeeze(x1) * x2
array([1, 4, 9])
除了在每个向量上调用
np.squence()
之外,还有其他方法吗?您得到的是广播的结果,它早在MATLAB之前就实现了。甚至在MATLAB之前,Octave也有
你有一个(3,1)和一个(3,)。在下部尺寸标注中添加一个前导尺寸标注,生成(1,3)。将这些数据一起广播到(3,3),然后进行数学运算
如果你能以某种方式关闭广播(你做不到),我预计会出现错误
您需要一个(3,)结果,因此您必须以某种方式删除(3,1)-压缩
,重塑
或[:,0]
索引的尾随维度
八度:
>> x1 = [1;2;3]; # (3,1)
>> y1 = [1,2,3]; # (1,3)
>> x1 .* y1 # (3,3)
ans =
1 2 3
2 4 6
3 6 9
从倍频程文档:
关于术语的说明:“广播”是由英国广播公司推广的术语Python编程语言中的Numpy数值环境。在里面 在其他编程语言和环境中,也可以使用广播 在MATLAB中称为二进制单例展开(BSX),是 “bsxfun”函数的名称),回收(R编程
语言)、单指令多数据(SIMD)或复制 启用关于倍频程扩展的警告:
>> warning ("on","Octave:language-extension")
>> x1 .* y1
warning: performing `product' automatic broadcasting
ans =
1 2 3
2 4 6
3 6 9
我不认为有更简单的方法<代码>np.挤压看起来很简单。这样做的原因是为了减少歧义,我想这是很多人喜欢的。还有一些替代方案,例如
x1.restorate(-1)
和x1.flatte()
(假设您只处理二维),但我怀疑这正是您想要的。