Python:区分行向量和列向量


73

有没有一种很好的方法来区分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)我想为自己的方便而与众不同。


9
您观察到的行为实际上在“真实世界”中是正确的维数字序列既不是行向量也不是列向量。行或列向量实际上是一个2门维阵列(其中该两个维度中的一个为1)。因此,应使用array([[1, 2, 3]])而不是与其转置相等的进行测试。
Eric O Lebigot 2015年

7
从数学上来说,这实际上是不正确的。矩阵是mxn,根据定义,行向量是m = 1的行,列向量是n = 1的行。在数学上,维数完全不同,它与向量空间中基本集合中向量的数量有关,因此,实际上我们根本不应该谈论单个向量的维数。我认为谈论“现实世界”的原始海报是在谈论线性代数和数学的世界,所以是正确的。程序员倾向于使用错误的术语。
eric

@neuronet,这其实是数学上不是正确。您要描述的是事物在Matlab中的状态,这是一个非常有用的约定。数学上正确的方法是区分给定空间的矢量(按约定表示为列)和其对偶空间的矢量(按约定表示为行)。
A. Donda

Answers:


77

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

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

我想过,但它意味着的GetItem变得不一致:a[0] = [1]a[0][0] = 1列向量和a[0] = 1a[0][0] = TypeError为行向量。
MarcinKonowalczyk

4
是的,您必须权衡这点。另一个选择是在需要区分时使用np.newaxis(请参阅编辑我的答案)。
bogatron

1
将行向量(1d数组)转换为列向量(返回副本)的另一种方法:a.reshape(a.size, 1),或者即使您a.reshape(-1, 1)像我一样懒惰
Yibo Yang

31

使用双 []编写向量时,。

然后,如果要行向量:

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

或者,如果您想要列向量:

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

11

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

  • 检查尺寸数 myvector.ndim1
  • 检查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


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)

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

array([1,2,3])[None,:]比显式的要复杂得多array([[1, 2, 3]])
Eric O Lebigot 2015年

2
matrix通常值得避免,因为它不能推广到更高的维度
Eric

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

2

如果我想要一个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代码可读:非常简单明了。


1

除非您在上下文中使用它,否则看起来Python的Numpy不会区分它:

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

“ :)您可以将rank-1数组视为行向量或列向量。dot(A,v)将v视为列向量,而dot(v,A)会将v视为行向量。这样可以省去键入很多移调。”

另外,特定于您的代码:“在1级数组上转置不会执行任何操作。”来源:http//wiki.scipy.org/NumPy_for_Matlab_Users


我知道。我想要一种区分它们的方法。也许其他数学模块?
MarcinKonowalczyk

0

当我尝试计算 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为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的形状失配(重量,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中的潜在陷阱


如果您尝试这样做np.hstacknp.vstack在一维数组列表上进行操作,实际上确实会有所不同!如果每个阵列具有形状(10, ),对于结果hstackIS(20,)和用于vstack(2, 10)。这意味着它们被假定为列向量!
n1k31t4 '18年

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

0

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


-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并制作一个类似于电子表格的数据透视表


2
既然你可以写在与NumPy同样的事情,我想补充的重要事实,即df[0] = 10df2[0] = 10工作的行和列向量的思维时,如预期。与NumPy相比,这是熊猫方便的地方。
Eric O Lebigot 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.