亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Numpy:np.abs 實際上是如何工作的?

Numpy:np.abs 實際上是如何工作的?

Go
江戶川亂折騰 2023-06-12 14:35:15
我正在嘗試在 Go 中為 gonum 密集向量實現我自己的絕對函數。我在想是否有比先平方再平方根更好的方法來獲取數組的絕對值?我的主要問題是我必須在這些向量上實現我自己的元素明智的牛頓平方根函數,并且在實現速度和準確性之間存在平衡。如果我能避免使用這個平方根函數,我會很高興。
查看完整描述

1 回答

?
溫溫醬

TA貢獻1752條經驗 獲得超4個贊

NumPy 源代碼可能很難瀏覽,因為它具有適用于多種數據類型的多種功能。您可以在文件中找到絕對值函數的 C 級源代碼scalarmath.c.src。該文件實際上是一個帶有函數定義的模板,構建系統稍后會為多種數據類型復制這些函數定義。請注意,每個函數都是為數組的每個元素運行的“內核”(循環遍歷數組是在其他地方完成的)。這些函數總是被稱為<name of the type>_ctype_absolute,其中<name of the type>是它適用的數據類型并且通常是模板化的。讓我們通過它們。

/**begin repeat

?* #name = ubyte, ushort, uint, ulong, ulonglong#

?*/


#define @name@_ctype_absolute @name@_ctype_positive


/**end repeat**/

這個是針對無符號類型的。在這種情況下,絕對值與 相同np.positive,它只是復制值而不做任何事情(如果你有一個數組a并且你這樣做,它就是你得到的+a)。

/**begin repeat

?* #name = byte, short, int, long, longlong#

?* #type = npy_byte, npy_short, npy_int, npy_long, npy_longlong#

?*/

static void

@name@_ctype_absolute(@type@ a, @type@ *out)

{

? ? *out = (a < 0 ? -a : a);

}

/**end repeat**/

這個用于有符號整數。非常簡單。


/**begin repeat

?* #name = float, double, longdouble#

?* #type = npy_float, npy_double, npy_longdouble#

?* #c = f,,l#

?*/

static void

@name@_ctype_absolute(@type@ a, @type@ *out)

{

? ? *out = npy_fabs@c@(a);

}

/**end repeat**/

這適用于浮點值。這里npy_fabsf,npy_fabsnpy_fabsl函數被使用。這些在 中聲明npy_math.h,但通過模板化的 C 代碼在 中定義npy_math_internal.h.src,本質上調用C/C99 對應項(除非 C99 不可用,在這種情況下fabsffabsl用 模擬fabs)。您可能認為前面的代碼應該也適用于浮點類型,但實際上這些更復雜,因為它們有 NaN、無窮大或帶符號的零之類的東西,所以最好使用處理所有問題的標準 C 函數可靠地。

static void

half_ctype_absolute(npy_half a, npy_half *out)

{

? ? *out = a&0x7fffu;

}

這實際上不是模板化的,它是半精度浮點值的絕對值函數。原來你可以通過按位運算(將第一位設置為 0)來更改符號,因為半精度比其他浮點類型更簡單(如果更有限)(對于那些通常是相同的,但有特殊情況).

/**begin repeat

?* #name = cfloat, cdouble, clongdouble#

?* #type = npy_cfloat, npy_cdouble, npy_clongdouble#

?* #rtype = npy_float, npy_double, npy_longdouble#

?* #c = f,,l#

?*/

static void

@name@_ctype_absolute(@type@ a, @rtype@ *out)

{

? ? *out = npy_cabs@c@(a);

}

/**end repeat**/

最后一個用于復雜類型。這些使用npy_cabsfnpycabs函數npy_cabsl,再次在中聲明,但在本例中使用C99 函數npy_math.h進行模板實現(除非該函數不可用,在這種情況下,它是用模擬的)。npy_math_complex.c.srcnp.hypot


查看完整回答
反對 回復 2023-06-12
  • 1 回答
  • 0 關注
  • 151 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號