86

有没有一种区分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),但为了我自己的方便,我想区分。

4

12 回答 12

90

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

>>> 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]])
于 2013-07-02T14:55:28.960 回答
41

[]编写向量时使用双精度。

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

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

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

col_vector = array([[1, 2, 3]]).T  # shape (3, 1)
于 2017-07-26T23:46:29.093 回答
19

您正在创建的向量既不是 row 也不是 column。它实际上只有一维。您可以通过以下方式验证

  • 检查维度的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

于 2018-12-12T14:10:24.877 回答
8

我认为您可以使用 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)
于 2015-05-27T05:44:28.800 回答
4

如果您想针对这种情况进行区分,我建议您改用 a 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]])
于 2013-07-02T15:05:00.190 回答
4

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

>>> 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]])
于 2019-02-20T01:44:53.457 回答
3

如果我想要一个 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)

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

于 2019-07-18T14:02:20.727 回答
1

除非您在上下文中使用它,否则 Python 的 Numpy 似乎无法区分它:

“如果你愿意,你可以有标准向量或行/列向量。”

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

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

于 2013-07-02T14:53:45.593 回答
1

当我尝试w^T * x使用 numpy 进行计算时,我也感到非常困惑。事实上,我自己无法实现它。因此,这是我们需要熟悉的 NumPy 中为数不多的陷阱之一。

一维数组而言,行向量和列向量之间没有区别。它们完全相同。

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

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为二维数组。

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])

请注意,由于形状与 np.dot(wt, w) 的使用不匹配,我们使用w,wt而不是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 中,操作数的顺序是颠倒的,正如上面所证明的,这与我们在理论线性代数中研究的相反。


PSnumpy 中的潜在陷阱

于 2017-03-20T15:50:24.190 回答
0

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

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

首先,我们制作一个二维数组,并将其作为唯一的行:

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

然后我们可以转置它:

>>> a.T
array([[1],
       [3],
       [4]])
于 2017-03-21T06:33:09.960 回答
0

行向量是 (1,0) 张量,向量是 (0, 1) 张量。如果使用 v = np.array([[1,2,3]]),v 变为 (0,2) 张量。对不起,我很困惑。

于 2019-11-01T05:43:34.270 回答
-1

优秀的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]])

您甚至可以定义一个 DataFrame 并制作一个类似电子表格的数据透视表

于 2013-07-02T15:09:38.440 回答