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_fabs
和npy_fabsl
函數被使用。這些在 中聲明npy_math.h
,但通過模板化的 C 代碼在 中定義npy_math_internal.h.src
,本質上調用C/C99 對應項(除非 C99 不可用,在這種情況下fabsf
并fabsl
用 模擬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_cabsf
和npycabs
函數npy_cabsl
,再次在中聲明,但在本例中使用C99 函數npy_math.h
進行模板實現(除非該函數不可用,在這種情況下,它是用模擬的)。npy_math_complex.c.src
np.hypot
- 1 回答
- 0 關注
- 151 瀏覽
添加回答
舉報