不能理解为什么x-y是一个矩阵?
x(4,)和y(4,1)的形状有什么区别,是不是都被视为向量?
>>> x = np.array([1,2,3,4])
>>> y = x[:,None]
>>> x.shape
(4,)
>>> y.shape
(4, 1)
>>> x
array([1, 2, 3, 4])
>>> y
array([[1],
[2],
[3],
[4]])
>>> x-y
array([[ 0, 1, 2, 3],
[-1, 0, 1, 2],
[-2, -1, 0, 1],
[-3, -2, -1, 0]])
答案 0 :(得分:3)
the documentation for numpy broadcasting -
对此进行了解释一般广播规则
在两个数组上运行时,NumPy会逐元素地比较它们的形状。 从尾随维度开始,并向前发展。
时兼容两个维度
- 他们是平等的,或
- 其中一个是1
醇>如果不满足这些条件,则抛出
ValueError: frames are not aligned
异常,表明阵列具有不兼容的形状。 生成的数组的大小是输入数组的每个维度的最大大小。数组不需要具有相同数量的维度。例如,如果您有一个256x256x3的RGB值数组,并且您希望将图像中的每种颜色缩放不同的值,则可以将图像乘以具有3个值的一维数组。根据广播规则排列这些数组的尾轴的大小,
(强调我的)
当操作具有形状(4,)
数组的形状(4,1)
数组时,第一个被广播到(1,4)
(因为它从尾随维度开始并向前推进,替换它们1
如果该维度没有值,则(4,)
变为(1,4)
。)然后同时操作它们一起创建一个形状(4,4)
的数组。
形状(4,1)
不被视为矢量。它是一个二维阵列。
如果x
为array([[1, 2, 3, 4]])
,形状为(1,4)
的数组 -
示例 -
In [70]: y
Out[70]:
array([[1],
[2],
[3],
[4]])
In [71]: x = np.array([x])
In [72]: x
Out[72]: array([[1, 2, 3, 4]])
In [73]: x - y
Out[73]:
array([[ 0, 1, 2, 3],
[-1, 0, 1, 2],
[-2, -1, 0, 1],
[-3, -2, -1, 0]])
广播总是从最后一个维度开始匹配,因此尝试类似下面的内容会引发错误 -
In [79]: y = np.array([[1,2,3,4],[5,6,7,8]])
In [80]: y.shape
Out[80]: (2, 4)
In [81]: x = np.array([1,2])
In [82]: x.shape
Out[82]: (2,)
In [83]: y - x
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-83-4abb3bd0a148> in <module>()
----> 1 y - x
ValueError: operands could not be broadcast together with shapes (2,4) (2,)
这是因为首先它检查两个数组的最后一个维度,一个是4
而另一个是2
,它们根据规则不匹配,因此它会抛出错误。如果x
的形状为(2,1)
,那就可以了。示例 -
In [84]: y - x.reshape((2,1))
Out[84]:
array([[0, 1, 2, 3],
[3, 4, 5, 6]])
答案 1 :(得分:1)
x(4,)和y(4,1)
的形状有什么区别
x
是一个向量;你需要1个索引才能访问它的元素。
y
是一个二维数组;你需要2个索引来访问它的元素。
不能理解为什么x-y是一个矩阵?
这是因为当您减去x
和y
广播时。{/ p>
x - y
变为:
[1 2 3 4 [1 1 1 1
1 2 3 4 2 2 2 2
-
1 2 3 4 3 3 3 3
1 2 3 4] 4 4 4 4]