一些 NumPy 函式(例如argmax或cumsum)可以將陣列作為可選out引數并將結果存盤在該陣列中。請原諒我對這里的術語的理解不夠完美(這使我無法在谷歌上搜索答案),但似乎這些函式以某種方式作用于超出其范圍的變數。
我將如何轉換這個簡單的函式,以便它可以接受一個out引數作為提到的函式?
import numpy as np
def add_two(a):
return a 2
a = np.arange(5)
a = add_two(a)
根據我的理解,重寫版本add_two()將允許將上面的最后一行替換為
add_two(a, out=a)
uj5u.com熱心網友回復:
在我看來,最好和最明確的做法是按照你目前的做法去做。Python 傳遞值,而不是將參考作為函式中的引數傳遞,因此您只能修改可變物件。
一種方法是這樣做:
import numpy as np
def add_two(a, out):
out[:] = a 2
a = np.arange(5)
add_two(a, out=a)
a
輸出:
array([2, 3, 4, 5, 6])
注意。與您當前的解決方案不同,這要求作為引數傳遞的物件out 存在并且是一個陣列
uj5u.com熱心網友回復:
天真的解決方案是用計算結果填充輸出陣列的緩沖區:
def add_two(a, out=None):
result = a 2
if out is None:
out = result
else:
out[:] = result
return out
問題(如果您可以這么稱呼的話)是您仍在生成中間陣列,并有效地繞過了首先預先分配結果的好處。一種更微妙的方法是使用outnumpy 管道中函式的引數:
def add_two(a, out=None):
return np.add(a, 2, out=out)
不幸的是,與一般矢量化一樣,這只能根據所需的操作集在逐案的基礎上完成。
順便說一句,這與范圍無關。Python 物件特別適用于所有命名空間(盡管它們的名稱可能不是)。如果在函式中修改了可變引數,則更改將始終在函式外部可見。參見例如“最小驚訝”和可變默認引數。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/389391.html
標籤:Python 麻木的 范围 numpy-ndarray
