Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何确保numpy中没有单例扩展_Python_Numpy - Fatal编程技术网

Python 如何确保numpy中没有单例扩展

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 *

从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 * 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()
(假设您只处理二维),但我怀疑这正是您想要的。