【发布时间】:2015-10-28 17:48:17
【问题描述】:
如果类型正确,将输入数组作为可选输出参数提供给 numpy 中的 ufunc 通常是否安全?例如,我已经验证了以下工作:
>>> import numpy as np
>>> arr = np.array([1.2, 3.4, 4.5])
>>> np.floor(arr, arr)
array([ 1., 3., 4.])
数组类型必须与输出(numpy.floor() 的浮点数)兼容或相同,否则会发生这种情况:
>>> arr2 = np.array([1, 3, 4], dtype = np.uint8)
>>> np.floor(arr2, arr2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: ufunc 'floor' output (typecode 'e') could not be coerced to provided output parameter (typecode 'B') according to the casting rule ''same_kind''
所以考虑到一个正确类型的数组,就地应用 ufunc 通常是安全的吗?还是floor() 是个例外?文档没有说清楚,以下两个与问题有切线关系的线程也没有说清楚:
编辑:
根据http://docs.scipy.org/doc/numpy/user/c-info.ufunc-tutorial.html 的教程,我会假设它通常是安全的,但并不总是安全的。在计算期间使用输出数组作为中间结果的临时持有者似乎没有任何限制。虽然像 floor() 和 ciel() 这样的东西可能不需要临时存储,但更复杂的功能可能需要。话虽这么说,整个现有的库都可以考虑到这一点。
【问题讨论】:
-
从技术上讲,它不是一个 ufunc,但是以这种方式将
out中的out参数与 2D 数组一起使用会产生不正确的结果。 -
这几乎是我正在寻找的反例,但不完全是:)
-
在“数学运算”下的提示中,ufunc docs 提到使用
add(G, C, G)作为G = G + C的优化。我会说它是安全的。 (另一方面,在输入和输出重叠但不相同的情况下调用 ufunc 会导致问题。) -
我之前没有注意到这个评论。我认为你是对的,因为它是安全的。
-
是的,但这属于重叠但不相同的输入。我只是想知道在满足所有其他条件的情况下是否可以安全地进行所有操作。
标签: python numpy in-place numpy-ufunc