Python:区分行和列向量

时间:2013-07-02 14:44:30

标签: python arrays numpy vector scipy

有没有一种很好的方法来区分python中的行和列向量?到目前为止,我正在使用numpy和scipy,到目前为止我看到的是,如果我要给一个向量,请说

from numpy import *
Vector = array([1,2,3])

他们无法说天气我的意思是行或列向量。此外:

array([1,2,3]) == array([1,2,3]).transpose()
True

在“现实世界”中哪个是不真实的。 我意识到来自上述模块的载体上的大多数功能都不需要区分。例如outer(a,b)a.dot(b),但为了方便起见,我想区分。

12 个答案:

答案 0 :(得分:57)

您可以通过向数组添加另一个维度来明确区分。

>>> a = np.array([1, 2, 3])
>>> a
array([1, 2, 3])
>>> a.transpose()
array([1, 2, 3])
>>> a.dot(a.transpose())
14

现在强制它成为列向量:

>>> a.shape = (3,1)
>>> a
array([[1],
       [2],
       [3]])
>>> a.transpose()
array([[1, 2, 3]])
>>> a.dot(a.transpose())
array([[1, 2, 3],
       [2, 4, 6],
       [3, 6, 9]])

另一种选择是在想要区分时使用np.newaxis:

>>> a = np.array([1, 2, 3])
>>> a
array([1, 2, 3])
>>> a[:, np.newaxis]
array([[1],
       [2],
       [3]])
>>> a[np.newaxis, :]
array([[1, 2, 3]])

答案 1 :(得分:21)

在编写矢量时使用双[]

然后,如果你想要一个行向量:

row_vector = array([[1, 2, 3]])    # shape (1, 3)

或者如果你想要一个列矢量:

col_vector = array([[1, 2, 3]]).T  # shape (3, 1)

答案 2 :(得分:5)

我认为你可以使用numpy.array的ndmin选项。保持2表示它将是(4,1)并且转置将是(1,4)。

>>> a = np.array([12, 3, 4, 5], ndmin=2)
>>> print a.shape
>>> (1,4)
>>> print a.T.shape
>>> (4,1)

答案 3 :(得分:4)

如果你想对这种情况感到不安,我建议改用matrix,其中:

matrix([1,2,3]) == matrix([1,2,3]).transpose()

给出:

matrix([[ True, False, False],
        [False,  True, False],
        [False, False,  True]], dtype=bool)

您还可以使用ndarray明确添加第二维:

array([1,2,3])[None,:]
#array([[1, 2, 3]])

和:

array([1,2,3])[:,None]
#array([[1],
#       [2],
#       [3]])

答案 4 :(得分:4)

您要创建的矢量既不是行列也不是列。它实际上只有1维。您可以通过以下方式进行验证

  • 检查尺寸为myvector.ndim的尺寸1
  • 检查myvector.shape (3,)(仅包含一个元素的元组)。对于行向量,应为(1, 3),对于列(3, 1)

两种解决方法

  • 创建一个实际行或列向量
  • reshape您当前的人

您可以显式创建行或列

row = np.array([    # one row with 3 elements
   [1, 2, 3]
]
column = np.array([  # 3 rows, with 1 element each
    [1],
    [2],
    [3]
])

或带有快捷方式

row = np.r_['r', [1,2,3]]     # shape: (1, 3)
column = np.r_['c', [1,2,3]]  # shape: (3,1)

或者,您可以将其重塑为(1, n)(对于行)或(n, 1)(对于列)

row = my_vector.reshape(1, -1)
column = my_vector.reshape(-1, 1)

-1会自动找到n的值。

答案 5 :(得分:2)

看起来Python的Numpy没有区分它,除非你在上下文中使用它:

“如果您愿意,可以使用标准向量或行/列向量。”

“:)你可以将rank-1数组视为行或列向量.dot(A,v)将v视为列向量,而dot(v,A)将v视为行向量。这可以节省你必须输入很多转座。“

此外,特定于您的代码:“在Rank-1数组上转置什么都不做。” 资源: http://wiki.scipy.org/NumPy_for_Matlab_Users

答案 6 :(得分:1)

您可以将数组的元素存储在行或列中,如下所示:

>>> a = np.array([1, 2, 3])[:, None] # stores in rows
>>> a
array([[1],
       [2],
       [3]])

>>> b = np.array([1, 2, 3])[None, :] # stores in columns
>>> b
array([[1, 2, 3]])

答案 7 :(得分:1)

如果我想要一个1x3数组或3x1数组:

import numpy as np
row_arr = np.array([1,2,3]).reshape((1,3))
col_arr = np.array([1,2,3]).reshape((3,1)))

检查您的工作:

row_arr.shape  #returns (1,3)
col_arr.shape  #returns (3,1)

我发现这里有很多答案是有帮助的,但对我来说太复杂了。在实践中,我返回到shapereshape,并且代码可读:非常简单明了。

答案 8 :(得分:0)

优秀的Pandas库为numpy添加了一些功能,使这些操作更加直观IMO。例如:

import numpy as np
import pandas as pd

# column
df = pd.DataFrame([1,2,3])

# row
df2 = pd.DataFrame([[1,2,3]])

你甚至可以define a DataFrame and make a spreadsheet-like pivot table

答案 9 :(得分:0)

当我尝试使用numpy计算w^T * x时,对我来说也是非常混乱。事实上,我自己无法实现它。所以,这是我们需要熟悉的NumPy中为数不多的陷阱之一。

1D数组而言,行向量和列向量之间没有区别。它们完全一样。

请看以下示例,其中我们在所有情况下得到相同的结果,这在(理论意义上的)线性代数中是不正确的:

In [37]: w
Out[37]: array([0, 1, 2, 3, 4])

In [38]: x
Out[38]: array([1, 2, 3, 4, 5])

In [39]: np.dot(w, x)
Out[39]: 40

In [40]: np.dot(w.transpose(), x)
Out[40]: 40

In [41]: np.dot(w.transpose(), x.transpose())
Out[41]: 40

In [42]: np.dot(w, x.transpose())
Out[42]: 40

有了这些信息,现在让我们尝试计算向量|w|^2的平方长度。

为此,我们需要将w转换为2D数组。

In [51]: wt = w[:, np.newaxis]

In [52]: wt
Out[52]: 
array([[0],
       [1],
       [2],
       [3],
       [4]])

现在,让我们计算向量w的平方长度(或平方幅度):

In [53]: np.dot(w, wt)
Out[53]: array([30])

请注意,我们使用了wwt代替wtw(就像在理论线性代数中一样),因为形状与使用np.dot不匹配( wt,w)。因此,我们将向量的平方长度设为[30]。也许这是区分(numpy的解释)行和列向量的方法之一?

最后,我是否提到我找到了实施w^T * x的方法?是的,我做了:

In [58]: wt
Out[58]: 
array([[0],
       [1],
       [2],
       [3],
       [4]])

In [59]: x
Out[59]: array([1, 2, 3, 4, 5])

In [60]: np.dot(x, wt)
Out[60]: array([40])

因此,在NumPy中,操作数的顺序是相反的,如上所述,与我们在理论线性代数中所研究的相反。

P.S。potential gotchas in numpy

答案 10 :(得分:0)

这是另一种直观的方式。假设我们有:

arrangedObjects

首先我们制作一个2D数组,将其作为唯一的一行:

>>> a = np.array([1, 3, 4])
>>> a
array([1, 3, 4])

然后我们可以转置它:

>>> a = np.array([a])
>>> a
array([[1, 3, 4]])

答案 11 :(得分:0)

行向量是(1,0)张量,向量是(0,1)张量。如果使用v = np.array([[1,2,3]]),则v成为(0,2)张量。抱歉,我很困惑。