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 版本有点花哨,可以处理多维数组并使用广播。