在numpy中,有些操作以形状(R, 1)返回,但有些返回(R,)。这将使矩阵乘法更加繁琐,因为需要显式重塑。例如,给定一个矩阵M,如果我们想要numpy。点(M [: 0], numpy。ones((1, R))),其中R是行数(当然,列方面也存在同样的问题)。我们将得到矩阵不是对齐错误,因为M[:,0]是在形状(R,),而是numpy。ones((1, R))的形状是(1,R)。

所以我的问题是:

形状(R, 1)和(R,)的区别是什么?我知道字面上它是一个数字的列表和列表的列表所有的列表都只包含一个数字。只是想知道为什么不设计numpy,使它更喜欢形状(R, 1)而不是(R,),以便于矩阵乘法。 对于上面的例子有没有更好的方法?不需要像这样显式地重塑:numpy.dot(M[:,0]。重塑(R, 1), numpy。((R)))


当前回答

形状(n,)的数据结构称为秩1数组。它的行为不像行向量或列向量那样一致,这使得它的一些操作和效果不直观。如果你对这个(n,)数据结构求转置,它看起来是一样的点积会给你一个数字而不是一个矩阵。 形状为(n,1)或(1,n)的行向量或列向量更直观和一致。

其他回答

这里已经有很多好的答案了。但对我来说,很难找到一些例子,形状或数组可以破坏所有的程序。

下面是一个例子:

import numpy as np
a = np.array([1,2,3,4])
b = np.array([10,20,30,40])


from sklearn.linear_model import LinearRegression
regr = LinearRegression()
regr.fit(a,b)

这将失败并产生错误:

ValueError:期望的2D数组,得到的是1D数组

但如果我们对a加上重塑:

a = np.array([1,2,3,4]).reshape(-1,1)

这是正确的!

1)不喜欢(R, 1)形状而不喜欢(R,)形状的原因是,它不必要地使事情复杂化。此外,为什么长度为R的向量默认使用shape (R, 1)而不是(1,R)会更好呢?当您需要额外的维度时,最好保持简单和明确。

2)对于你的例子,你正在计算一个外部产品,所以你可以通过使用np.outer来实现这一点,而不需要一个重塑调用:

np.outer(M[:,0], numpy.ones((1, R)))

需要明确的是,我们谈论的是:

NumPy数组,也称为NumPy .ndarray 数组的形状,由numpy.ndarray.shape所知 这个问题假设了一些未知的numpy。形状为(R,)的ndarray,其中R应该理解为其各自维度的长度

NumPy数组有一个形状。这个.shape由一个元组表示,其中元组中的每个元素都告诉我们该维度的长度。为了保持简单,让我们坚持行和列。而numpy的值。Ndarray在下面的例子中不会改变,但形状会。

让我们考虑一个值为1、2、3和4的数组。

我们的例子将包括以下.shape表示:

(4,)  # 1-dimensional array with length 4
(1,4) # 2-dimensional array with row length 1, column length 4
(4,1) # 2-dimensional array with row length 4, column length 1

我们可以更抽象地考虑变量a和b。

(a,)  # 1-dimensional array with length a
(b,a) # 2-dimensional array with row length b, column length a
(a,b) # 2-dimensional array with row length a, column length b

对我来说,“手动”构建它们有助于更好地理解它们的维度含义。

>> # (4,)
>> one_dimensional_vector = np.array(
    [1, 2, 3, 4]
)

>> # (1,4)
>> row_vector = np.array(
    [
        [1, 2, 3, 4]
    ]
)

>> # (4,1)
>> column_vector = np.array(
    [
        [1], 
        [2], 
        [3], 
        [4]
    ]
)

第一个问题的答案是

形状(R, 1)和形状(R,)的区别是什么?

答:它们有不同的维度。A是一个维度的长度,b是另一个维度的长度,.shape分别是(A, b)和(A,)。B恰好是1。一种考虑方法是,如果a = 1,那么行长度为1,因此它是行向量。如果b = 1,则该列的长度为1,因此numpy。它表示的Ndarray是一个列向量。

对于上面的例子有没有更好的方法?

回答:让我们假设我们有上面示例中使用的数组,其中1、2、3和4为值。使(R,)为(R, 1)的简便方法是:

>> one_dimensional_array = np.array([1,2,3,4])
>> one_dimensional_array.shape
(4,)
>> row_vector = one_dimensional_array[:, None]
>> row_vector.shape
(4, 1)

资源

NumPy - ndarrays - https://numpy.org/doc/stable/reference/arrays.ndarray.html 交叉验证@unutbu -维戏法- https://stats.stackexchange.com/a/285005

形状(n,)的数据结构称为秩1数组。它的行为不像行向量或列向量那样一致,这使得它的一些操作和效果不直观。如果你对这个(n,)数据结构求转置,它看起来是一样的点积会给你一个数字而不是一个矩阵。 形状为(n,1)或(1,n)的行向量或列向量更直观和一致。

形状是一个元组。如果只有一个维度,形状将是一个数字,逗号后是空白。对于2+维度,所有的逗号后面会有一个数字。

# 1 dimension with 2 elements, shape = (2,). 
# Note there's nothing after the comma.
z=np.array([  # start dimension
    10,       # not a dimension
    20        # not a dimension
])            # end dimension
print(z.shape)

(2)

# 2 dimensions, each with 1 element, shape = (2,1)
w=np.array([  # start outer dimension 
    [10],     # element is in an inner dimension
    [20]      # element is in an inner dimension
])            # end outer dimension
print(w.shape)

(2, 1)