有没有一种优雅的方法可以防止numpy在空列表上拍打dtype?

时间:2019-06-01 20:49:42

标签: python list numpy type-inference

考虑以下示例,它看起来很愚蠢,但实际上是现实世界中烦人的精简版本:

import numpy as np
a = np.zeros(5, int)
b = [*range(5)]
for i in reversed(range(5)):
    a[:i] += b[:i]

# Traceback (most recent call last):
#  File "<stdin>", line 2, in <module>
# TypeError: Cannot cast ufunc add output from dtype('float64') to dtype('int64') with casting rule 'same_kind'                                                                                                         

由于numpy无法再推断rhs列表的正确dtype,所以在上一次迭代时会引发此异常。

当然,很容易显式检查空操作数

for i in reversed(range(5)):
    if b[:i]:
        a[:i] += b[:i]

但是我想知道是否有更优雅的解决方案。

1 个答案:

答案 0 :(得分:0)

只想分享我最后的努力。至少很短:

for i in reversed(range(5)):
    a[:i] += b[:i] or 0

a
# array([0, 3, 4, 3, 0])