Python Numpy Dott的怪异行为

Python Numpy Dott的怪异行为,python,numpy,Python,Numpy,我正在使用python3.5,我有一个问题:为什么np.dot()的行为是这样的 >> a = np.array([[1,2,3,4]]) >> b = np.array([123]) >> np.dot(a,b) Traceback (most recent call last): File "<input>", line 1, in <module> ValueError: shapes (1,4) and (1,) not a

我正在使用python3.5,我有一个问题:为什么np.dot()的行为是这样的

>> a = np.array([[1,2,3,4]])
>> b = np.array([123])
>> np.dot(a,b)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
ValueError: shapes (1,4) and (1,) not aligned: 4 (dim 1) != 1 (dim 0)
>>np.dot(b,a)
array([123, 246, 369, 492])
>a=np.array([[1,2,3,4]]
>>b=np.数组([123])
>>np.dot(a,b)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
ValueError:形状(1,4)和(1,)未对齐:4(尺寸1)!=1(尺寸0)
>>np.dot(b,a)
数组([123246369492])
帮助(np.dot)
中,我们了解到,
np.dot(x,y)
x的最后一个轴与
y
的倒数第二个轴的和积

np.dot(a,b)
的情况下,
a
的最后一个轴是4,
b
的唯一轴的长度是1。他们不匹配:失败

np.dot(b,a)
的情况下,
b
的最后一个轴是1,
a
的倒数第二个轴是1。他们匹配:成功

权变措施 根据您对
np.dot(a,b)
的意图,您可能需要:

>>> np.dot(a, np.resize(b,a.shape[-1]))
array([1230])
help(np.dot)
中,我们了解到,
np.dot(x,y)
x的最后一个轴与
y
的倒数第二个轴的和积

np.dot(a,b)
的情况下,
a
的最后一个轴是4,
b
的唯一轴的长度是1。他们不匹配:失败

np.dot(b,a)
的情况下,
b
的最后一个轴是1,
a
的倒数第二个轴是1。他们匹配:成功

权变措施 根据您对
np.dot(a,b)
的意图,您可能需要:

>>> np.dot(a, np.resize(b,a.shape[-1]))
array([1230])
从用于
numpy.dot(x,y)

对于二维数组,它等价于矩阵乘法,对于一维数组,它等价于向量的内积。。。对于N维,它是
x
最后一个轴与
y
倒数第二个轴的和积:

那么,你有:

a = np.array([[1,2,3,4]])  # shape is (1, 4), 2-D array (matrix)
b = np.array([123])        # shape is (1,),   1-D array (vector)
  • np.dot(b,a)
    工作(
    (1,)*(1,4)
    ,相关尺寸一致)
  • np.点(a,b)
    不(
    (1,4)*(1,)
    ,相关尺寸不一致,操作未定义。请注意,
    (1,)
    的“倒数第二个”轴对应于其唯一的一个轴)
这与有两个二维阵列(即矩阵)时的行为相同:

a = np.array([[1,2,3,4]])  # shape is (1, 4)
b = np.array([[123]])      # shape is (1, 1)
  • np.点(b,a)
    工作(
    (1,1)*(1,4)
    ,内部矩阵尺寸一致)
  • np.点(a,b)
    不(
    (1,4)*(1,1)
    ,内部矩阵尺寸不一致)
但是,如果有两个一维数组,即向量,则两种操作都不起作用:

a = np.array([1,2,3,4])   # shape is (4,)
b = np.array([123])       # shape is (1,)
  • np.dot(b,a)
    不起作用(
    (1,)*(4,)
    ,但只能为相同长度的向量定义内积)
  • np.dot(a,b)
    不工作(
    (4,)*(1)
    ,相同)
从for
numpy.dot(x,y)

对于二维数组,它等价于矩阵乘法,对于一维数组,它等价于向量的内积。。。对于N维,它是
x
最后一个轴与
y
倒数第二个轴的和积:

那么,你有:

a = np.array([[1,2,3,4]])  # shape is (1, 4), 2-D array (matrix)
b = np.array([123])        # shape is (1,),   1-D array (vector)
  • np.dot(b,a)
    工作(
    (1,)*(1,4)
    ,相关尺寸一致)
  • np.点(a,b)
    不(
    (1,4)*(1,)
    ,相关尺寸不一致,操作未定义。请注意,
    (1,)
    的“倒数第二个”轴对应于其唯一的一个轴)
这与有两个二维阵列(即矩阵)时的行为相同:

a = np.array([[1,2,3,4]])  # shape is (1, 4)
b = np.array([[123]])      # shape is (1, 1)
  • np.点(b,a)
    工作(
    (1,1)*(1,4)
    ,内部矩阵尺寸一致)
  • np.点(a,b)
    不(
    (1,4)*(1,1)
    ,内部矩阵尺寸不一致)
但是,如果有两个一维数组,即向量,则两种操作都不起作用:

a = np.array([1,2,3,4])   # shape is (4,)
b = np.array([123])       # shape is (1,)
  • np.dot(b,a)
    不起作用(
    (1,)*(4,)
    ,但只能为相同长度的向量定义内积)
  • np.dot(a,b)
    不工作(
    (4,)*(1)
    ,相同)

这不是一个真正的答案,但从文档中观察到,此功能的开发更多地考虑了性能而不是灵活性(请参阅输出参数上的注释:“这是一个性能特性。因此,如果不满足这些条件,将引发异常,而不是尝试灵活处理。”)。因此,我可以想象,出于同样的原因,没有做出任何努力来考虑您的输入。这不是一个真正的答案,但从文档中观察到,该函数的开发更多地考虑了性能而不是灵活性(请参见关于输出参数的注释:“这是一个性能特性。因此,如果不满足这些条件,将引发异常,而不是尝试灵活处理。”)。因此,我可以想象,出于同样的原因,也没有做出任何努力来允许您的输入。从技术上讲,
b
是(1,)数组,1d带有1个元素,而不是(1,1)但是对于这个计算来说,重要的是
a
的二维形状。事实上,我也意识到了这一点。现在编辑答案。从技术上讲
b
是(1,)数组,1d带有1个元素,而不是(1,1)。但是对于这个计算来说,重要的是
a
的二维形状。事实上,我也意识到了这一点。现在编辑答案。