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)
元素乘法 - 将 a 的元素复制 2 次和 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 版本有点花哨,可以处理多维数组并使用广播。