Как правило, безопасно предоставлять входной массив как необязательный аргумент out для ufunc в numpy, если тип правильный? Например, я проверил, что следующие работы:
>>> import numpy as np
>>> arr = np.array([1.2, 3.4, 4.5])
>>> np.floor(arr, arr)
array([ 1., 3., 4.])
Тип массива должен быть либо совместимым, либо идентичным с выходом (который является float для 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''
Итак, учитывая, что массив подходящего типа, вообще ли безопасно применять ufuncs на месте? Или floor()
исключительный случай? Документация не дает понять, и ни один из следующих двух потоков, имеющих касательное отношение к вопросу:
EDIT:
Как предположение первого порядка, я бы предположил, что это часто, но не всегда безопасно, на основе учебника на http://docs.scipy.org/doc/numpy/user/c-info.ufunc-tutorial.html. По-видимому, не существует ограничений на использование выходного массива в качестве временного владельца для промежуточных результатов во время вычисления. Хотя что-то вроде floor()
и ciel()
может не требовать временного хранения, более сложные функции могут. При этом вся существующая библиотека может быть написана с учетом этого.