Python 永远不要分配numpy.ufunc的输出

Python 永远不要分配numpy.ufunc的输出,python,numpy,Python,Numpy,此问题提供了有关使用输入作为输出以使用numpy.ufunc就地计算某物的信息: 是否可以避免为numpy.ufunc的不需要的输出分配空间?例如,假设我只需要来自modf的两个输出中的一个。我是否可以确保永远不会分配另一个不需要的数组 我原以为将\uuu传递到外可能会这样做,但它会抛出一个错误: import numpy as np ar = np.arange(6)/3 np.modf(ar, out=(ar, _)) TypeError: return arrays mus

此问题提供了有关使用输入作为输出以使用
numpy.ufunc
就地计算某物的信息:

是否可以避免为
numpy.ufunc
的不需要的输出分配空间?例如,假设我只需要来自
modf
的两个输出中的一个。我是否可以确保永远不会分配另一个不需要的数组

我原以为将
\uuu
传递到
可能会这样做,但它会抛出一个错误:

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

TypeError: return arrays must be of ArrayType

正如文档中所说,传递
None
意味着在函数中分配并返回输出数组。我可以忽略返回的值,但它仍然必须在函数内部分配和填充。

您可以通过传递一个“假”数组来最小化分配:

此虚拟数组与单个
一样大,并且
modf
不会在内部进行分配

编辑根据@Eric和@hpaulj的建议,一个更普遍和长期的解决方案是

np.lib.stride_tricks._broadcast_to(np.empty(1, ar.dtype), ar.shape, False, False)

为什么要担心这个?返回多个数组的
ufunc
并不多。使用
np.余数(arr,1)
如何?这更多的是一个关于
ufunc
限制的问题,而不是一个特定的用例。我的额外阅读使我确信这是不可能的。
np.broadcast_to(np.empty((),dtype),shape)
是一种更通用的模式,它也适用于非数字数组。
np.modf(ar,out=(ar,np.broadcast_to(np.empty((),ar.dtype),ar.shape))
不起作用,因为第二个输出是只读的。这很好!第二个输出仍然是长度正确的数组,但所有元素都指向内存中的同一位置。
broadcast\u to
broadcast\u数组
都使用
np.lib.stride\u技巧。\u broadcast\u to
。一个使用
readonly=True
参数,另一个将其设置为
False
。但是代码中有一个TODO注释,关于将其更改为
readonly
,因此从长远来看,这个答案可能需要修改。有趣的是,所有这些中的底层工具都是
nditer
np.lib.stride_tricks._broadcast_to(np.empty(1, ar.dtype), ar.shape, False, False)