3

我不明白乘以 Numpy.arrays 时会发生什么。

例如,使用锯齿状(或锯齿状)数组

import numpy as np
a = np.array([[1,2,3],[100,200]])
b = np.array([2, 4])
print(a * b)

我明白了

[[1, 2, 3, 1, 2, 3] [100, 200, 100, 200, 100, 200, 100, 200]]

但是,如果我稍微修改一下

import numpy as np
a = np.array([[1,2],[100,200]])
b = np.array([2, 4])
print(a * b)

我明白了

[[  2   8]
[200 800]]

我想找到数组乘法的定义。

4

4 回答 4

3

您的主要问题是您的数组a不是“正常”数组,因为第二个维度不相等。如果你尝试a.shape你得到(2,)a.dtype给出dtype('O')(意思是对象),并a[0].dtype导致属性错误'list' object has no attribute 'dtype'。这意味着您有一个维度为 2 的 numpy 数组,每个数组都包含一个 python 列表。

您应该查找broadcasting,但这不是根本原因。1如果数组在操作期间不匹配,它通常旨在将大小的维度扩展到更大的值。它还有很多内容,但文档非常清楚。对于您的特定问题,只需说广播意味着如果两个数组的维度匹配或其中一个为 1(从后到前计数,用 1 填充空值),则 numpy 不会引发错误。

您有两个(2,)数组(a包含 2 个列表,b包含 2 个整数),这意味着尺寸适合(无需广播)。

这个“错误行为”的其余部分(它不是)与 numpy 无关,因为在标准 python 中(因为a包含 python 列表而起作用)将列表与标量重复并经常附加列表。

所以

>>>[1, 2, 3] * 3
[1, 2, 3, 1, 2, 3, 1, 2, 3]

在你的情况下也会发生同样的事情:第一个列表a乘以,2第二个列表乘以4

于 2016-11-08T08:14:17.407 回答
0

我认为它“复制('a'数组列[x])('b'数组索引[x])次”。如果您的目标是乘法,请改用 NP.dot

于 2016-11-08T07:09:03.060 回答
0

np.tensordot文档中的示例可能会有所帮助。它创建一个字符串对象数组,并显示dot产生字符串复制。

对于字符串和列表*意味着复制

In [134]: 'abc'*3
Out[134]: 'abcabcabc'

你的数组:

In [126]: a
Out[126]: array([[1, 2, 3], [100, 200]], dtype=object)
In [127]: b
Out[127]: array([2, 4])

和一个字符串数组(我也可以这样做a[:]=['a','B']

In [128]: c = np.array(['a','B'],dtype=object)
In [129]: c
Out[129]: array(['a', 'B'], dtype=object)

元素乘法 - 复制元素a2 和 3 次。

In [130]: a*b
Out[130]: array([[1, 2, 3, 1, 2, 3], [100, 200, 100, 200, 100, 200, 100, 200]], dtype=object)

dot产品 - 同样的事情,但它对 * 之后的值进行“求和” - 列表的总和是连接。

In [131]: a.dot(b)
Out[131]: [1, 2, 3, 1, 2, 3, 100, 200, 100, 200, 100, 200, 100, 200]

同样的事情发生在字符数组、复制和连接上。

In [132]: c*b
Out[132]: array(['aa', 'BBBB'], dtype=object)
In [133]: c.dot(b)
Out[133]: 'aaBBBB'

在处理对象 dtype 数组时,numpy 本质上会遍历元素并应用定义该对象类的运算符/方法。

a*b有效

In [147]: [i*j for i,j in zip(a,b)]
Out[147]: [[1, 2, 3, 1, 2, 3], [100, 200, 100, 200, 100, 200, 100, 200]]

numpy 版本有点花哨,可以处理多维数组并使用广播。

于 2016-11-08T17:02:04.907 回答
-1

基本上 numpy 数组 a*b 返回基本乘法,乘法应该像这样工作。

例如-1

import numpy as np
a = np.array([[1,2],[3,4]])
b = np.array([[5,6],[7,8]])
print(a * b)

输出:

[[ 5 12] [21 32]]

例-2

import numpy as np
a = np.array([[1,2],[3,4]])
b = np.array([5,6])
print(a * b)

输出:

[[ 5 12] [15 24]]
于 2016-11-08T07:17:48.323 回答