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)