考虑以下示例,它看起来很愚蠢,但实际上是现实世界中烦人的精简版本:
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]
但是我想知道是否有更优雅的解决方案。
答案 0 :(得分:0)
只想分享我最后的努力。至少很短:
for i in reversed(range(5)):
a[:i] += b[:i] or 0
a
# array([0, 3, 4, 3, 0])