【问题标题】:Is array([2,1]) 1 row & 2 cols or 2 rows & 1 col?(In python numpy)数组([2,1])是 1 行和 2 列还是 2 行和 1 列?(在 python numpy 中)
【发布时间】:2021-01-30 03:47:11
【问题描述】:

在python库numpy中,是array([2,1])(1,2)还是(2,1)_(row,col)?

我在下面尝试了 3 次,但找不到答案。

import numpy as np

x = np.array([1,2])
y = np.array([[1,3,5], [2,4,6]])
z = np.array([[1,2],[3,4],[5,6]])
o = np.array([1,2,3])

print(np.dot(x,y))
print(np.dot(z,x))
print(np.dot(x,o))

第一个和第二个有效,但最后一个没有。错误是:-

ValueError: shapes (2,) and (3,) not aligned: 2 (dim 0) != 3 (dim 0)

在我看来, 在情况 1 中,x =(1 行和 2 列) 在情况 2 中,x =(2 行和 1 列) 在第 3 种情况下,x 应该是(2 行和 1 列),但它没有用

请告诉我为什么会这样。

【问题讨论】:

  • 数字表示数组的而不是形状。
  • 两者都不是。它是一个一维数组,形状为 (2,)。
  • np.dot(x,o) 的结果是您期望的确切数组内容是什么?

标签: python arrays list numpy


【解决方案1】:
In [272]: x = np.array([1,2])
     ...: y = np.array([[1,3,5], [2,4,6]])
     ...: z = np.array([[1,2],[3,4],[5,6]])
     ...: o = np.array([1,2,3])
     ...: 
In [273]: x.shape
Out[273]: (2,)              # 1 element tuple
In [274]: y.shape
Out[274]: (2, 3)            # 2 element tuple
In [275]: z.shape
Out[275]: (3, 2)
In [276]: o.shape
Out[276]: (3,)

维度的行/列解释适合yz 等2 个数组。 xo 不适合。

我们可以从x 创建一个二维数组,其中一行显式,两列:

In [277]: x[None,:].shape
Out[277]: (1, 2)

但对于许多用途而言,(2,) 形状与 (1,2) 形状一样有效。

np.dot 有关于它如何处理一维数组的详细记录的规则。

基本规则是对A的最后一个dim和B的最后一个dim进行乘积之和,并留有1d的余量。

x, y   (2,) with (2,3) => (3,)  (the 2's pair)
z, x   (3,2) with (2,) => (3,)  (the 2's pair)
x, o  (2,) with (3,)  no match!

A (n,2) 将与 (2,3) 打点以产生 (n,3) 结果。同样, (3,2) 和 (2,n) 会产生 (3,n)。

【讨论】:

    【解决方案2】:

    这是学习numpy 时的“黄金”规则:在应用形状兼容性规则时,永远不要考虑行和列。

    话虽如此,这里是np.dot(a,b) 的形状兼容性规则(以编号 符号复制here

    1. 如果 a 和 b 都是一维数组,则它是向量的内积(没有复共轭)。
    2. 如果 a 和 b 都是二维数组,则为矩阵乘法,但最好使用 matmul 或 a @ b。
    3. 如果 a 或 b 为 0-D(标量),则相当于乘法,并且首选使用 numpy.multiply(a, b) 或 a * b。
    4. 如果 a 是 N 维数组而 b 是一维数组,则它是 a 和 b 的最后一个轴的和积。
    5. 如果 a 是 N 维数组且 b 是 M 维数组(其中 M>=2),则它是 a 的最后一个轴和 b 的倒数第二个轴的和积

    (请注意,没有任何规则以 rowscolumns 表示。它们仅以 dimensions 表示数组ab)

    在我们的例子中:

    x 是一个包含2 元素的一维数组(或“向量”)。

    y 是一个二维数组,形状为(2,3)

    z 是一个二维数组,形状为(3,2)

    o 是一个包含3 元素的一维数组(或“向量”)。

    对于np.dot(x,y),规则(5) 适用。

    对于np.dot(z,x),规则(4) 适用。

    对于np.dot(x,o),尝试使用rule(1) 并失败,因为您不能对2 元素的向量与3 元素的另一个向量进行内积。 (两个向量需要有相同数量的元素)

    【讨论】:

    • 我完全理解。非常感谢!!
    【解决方案3】:

    我不确定您的问题是什么,当您有 (X,) X 表示元素数并且 (X,Y) 是 x 行和 Y 列时

    x.shape -> (2,) 2 elements
    o.shape -> (3,) 3 elements
    y.shape -> (2, 3) 2 rows 3 cols
    z.shape -> (3, 2) 3 rows 2 cols
    

    所以 np.dot(x,o) 会给你一个错误

    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "<__array_function__ internals>", line 6, in dot
    ValueError: shapes (2,) and (3,) not aligned: 2 (dim 0) != 3 (dim 0)
    

    【讨论】:

    • 不,(3,) 是 3 个元素。 (1,3) 是二维行/列形状。
    • 是的,我知道我只是想使用(r,c) 符号让对方理解
    • @Kenan -- 在 1 维数组的上下文中,任何提及行和列都是不明智的,并且是学习 numpy 时产生误解的根源。在二维数组的上下文中,应严格提及行和列。所以,我宁愿说x 没有1 行2 列。它只是一个一维数组,仅此而已。
    • 更新以帮助阻止误解的传播
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多