有没有一种很好的方法来区分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)
,但为了方便起见,我想区分。
答案 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)
我发现这里有很多答案是有帮助的,但对我来说太复杂了。在实践中,我返回到shape
和reshape
,并且代码可读:非常简单明了。
答案 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])
请注意,我们使用了w
,wt
代替wt
,w
(就像在理论线性代数中一样),因为形状与使用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中,操作数的顺序是相反的,如上所述,与我们在理论线性代数中所研究的相反。
答案 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)