这是有效的:
In [49]: type([1, 2, 3])
Out[49]: list
In [50]: type(array([1, 2, 3]))
Out[50]: numpy.ndarray
In [52]: 1j*array([1, 2, 3])
Out[52]: array([ 0.+1.j, 0.+2.j, 0.+3.j])
当我尝试在我自己的列表asdf
上执行此操作时:
In [46]: type(asdf)
Out[46]: list
In [47]: type(array(asdf))
Out[47]: numpy.ndarray
In [48]: 1j*array(asdf)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-48-dd0d8b4948e8> in <module>()
----> 1 1j*array(asdf)
TypeError: unsupported operand type(s) for *: 'complex' and 'numpy.ndarray'
乘法似乎对短名单感到满意,asdf
可能出错?它相当大,20347个元素,但这不重要吗?
答案 0 :(得分:2)
Python解释器将*
转换为对__mul__
(或其中一个变体)的调用。对于3 * obj
,它将使用obj
。
以asdf
包含字符串的评论为基础
In [205]: A=np.array(['A','B','C'])
In [206]: B=np.array([1,2,3])
In [207]: B.__mul__(3)
Out[207]: array([3, 6, 9])
In [208]: A.__mul__(3)
Out[208]: NotImplemented
对于字符串数组,该方法返回'NotImplemented',而没有说明原因。这可能就是为什么错误消息显示numpy.array
A
的类型,而不是dtype
的{{1}}。这是一个解释器错误消息,而不是A
消息。
有numpy
版本可以使用字符串:
multiply
但不是复杂的乘数。