2017-06-30 53 views
0

我有一个一维数组numpy v。我想将它复制成矩阵,每行都是v的副本。这很简单:np.broadcast_to(v, desired_shape)numpy:横向广播一个向量

但是,如果我想对待v载体,并将其复制到做一个矩阵,每个是的v副本,我无法找到一个简单的方法来做到这一点。经过反复试验,我能够做到这一点:

np.broadcast_to(v.reshape(v.shape[0], 1), desired_shape) 

虽然这工作,我不能自称了解它(即使我写的!)。

问题的一部分是numpy似乎没有列矢量的概念(因此reshape黑客而不是数学中的仅仅是.T)。

但是,更深层的问题似乎是广播只能垂直工作,而不是水平工作。或者,也许更准确的说法是:广播只能在较高维度上进行,而不能在较低维度上进行。 我甚至不确定这是否正确。

总之,虽然我理解广播的概念,但是当我尝试将其用于特定应用程序时,例如复制col矢量以制作矩阵时,我迷了路。

你能帮我理解还是提高这个代码的可读性

+0

NumPy不是面向矩阵的。如果你愿意,你可以把它看作张量导向。一维数组没有两个维度来交换转置。 – user2357112

回答

1

https://en.wikipedia.org/wiki/Transpose - 这篇关于转置的文章只谈论转置矩阵。

https://en.wikipedia.org/wiki/Row_and_column_vectors -

的列向量或列矩阵是m×1矩阵 的行向量或列矩阵是一个1×m的矩阵

可以容易地创建的行或列向量(矩阵):

In [464]: np.array([[1],[2],[3]]) # column vector 
Out[464]: 
array([[1], 
     [2], 
     [3]]) 
In [465]: _.shape 
Out[465]: (3, 1) 

In [466]: np.array([[1,2,3]]) # row vector 
Out[466]: array([[1, 2, 3]]) 
In [467]: _.shape 
Out[467]: (1, 3) 

但在numpy的基本结构是一个array,正不是矢量或矩阵。

[阵列在计算机科学] - 一般地,数据项的集合可以通过在运行时

numpy阵列可以具有0个或多个尺寸计算指数来选择。相反,MATLAB矩阵有2个或更多维度。最初的2d矩阵是MATLAB所有的。

要有意义地谈论转置,您必须至少有2个维度。一个可能有一个大小,并映射到一维矢量,但它仍然是一个矩阵,一个2D对象。

因此,将维度添加到1d数组中,无论是使用reshape还是[:,None]都不是黑客。这是一个完美的有效和正常的numpy操作。

基本广播规则是:

  • 尺寸1的尺寸可被改变以匹配另一阵列

  • 尺寸1的尺寸可以在自动添加的相应尺寸左(前)以匹配维数。

在这个例子中,这两个步骤适用:(5)=>(1,5)=>(3,5)

In [458]: np.broadcast_to(np.arange(5), (3,5)) 
Out[458]: 
array([[0, 1, 2, 3, 4], 
     [0, 1, 2, 3, 4], 
     [0, 1, 2, 3, 4]]) 

在此,我们必须明确添加尺寸一维在右边(结束):

In [459]: np.broadcast_to(np.arange(5)[:,None], (5,3)) 
Out[459]: 
array([[0, 0, 0], 
     [1, 1, 1], 
     [2, 2, 2], 
     [3, 3, 3], 
     [4, 4, 4]]) 

np.broadcast_arrays(np.arange(5)[:,None], np.arange(3))产生两个(5,3)阵列。 (3,5)。其中,(3)中的每一个都代表所述第一个字母数字字母,第二个字母数字字母代表所述第一个字母数字字符。

产生一个错误,因为它无法确定您想要(5,3)或(3,5)或其他东西。

+0

“尺寸为1的尺寸可以自动添加到右侧” - 在您的示例中,它似乎是在_left_上添加的。在右侧,它需要手动添加。 – SRobertJames

+0

更正 - 我不是诵读困难;我只需要大量的证明阅读。 – hpaulj

0

广播总是在左侧添加新的维度,因为它会模棱两可,并且容易出错,试图猜测您何时需要新维度。您可以制作一个功能,通过反转轴,广播和倒车向右播放:

def broadcast_rightward(arr, shape): 
    return np.broadcast_to(arr.T, shape[::-1]).T