никогда не размещайте вывод numpy.ufunc - PullRequest
0 голосов
/ 16 ноября 2018

Этот вопрос содержит информацию об использовании входных данных в качестве выходных для вычисления чего-либо на месте с numpy.ufunc:

Можно ли избежать выделения места для нежелательного вывода numpy.ufunc? Например, скажем, я хочу только один из двух выходов из modf. Могу ли я убедиться, что другой нежелательный массив никогда не выделяется вообще?

Я думал, что передача _ в out может сделать это, но выдает ошибку:

import numpy as np
ar = np.arange(6)/3
np.modf(ar, out=(ar, _))    

TypeError: return arrays must be of ArrayType

Как сказано в документации, передача None означает, что выходной массив выделен в функции и возвращен. Я могу игнорировать возвращаемые значения, но все равно его нужно распределить и заполнить внутри функции.

1 Ответ

0 голосов
/ 16 ноября 2018

Вы можете минимизировать распределение, передав «поддельный» массив:

ar = np.arange(6) / 3
np.modf(ar, ar, np.broadcast_arrays(ar.dtype.type(0), ar)[0])

Этот фиктивный массив имеет размер, равный одному double, и modf не будет выполнять внутреннее распределение.

РЕДАКТИРОВАТЬ В соответствии с предложениями @Eric и @hpaulj, более общее и долгосрочное решение будет

np.lib.stride_tricks._broadcast_to(np.empty(1, ar.dtype), ar.shape, False, False)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...