1. 程式人生 > >NumPy學習筆記:3、更加復雜的數組

NumPy學習筆記:3、更加復雜的數組

ssi ram 有符號 -c .sh [0 tab sin pes

一、更多的數據類型

1、Casting

(1) 在混合數據類型的運算中,最終運算結果的數據類型與size更大的數據類型相同。

>>> np.array([1, 2, 3]) + 1.5
array([ 2.5,  3.5,  4.5])

(2) 給數組中的元素賦值,並不能改變整個數組的數據類型。(若把整型數組中的某個元素賦值為浮點型數據,則這個浮點型數據會被截斷為整型)

>>> a = np.array([1, 2, 3])
>>> a.dtype
dtype(int64)
>>> a[0] = 1.9     #
<-- float is truncated to integer >>> a array([1, 2, 3])

(3) 強制類型轉換

>>> a = np.array([1.7, 1.2, 1.6])
>>> b = a.astype(int)  # <-- truncates to integer
>>> b
array([1, 1, 1])

(4) 四舍五入,但並不改變數組的數據類型

>>> a = np.array([1.2, 1.5, 1.6, 2.5, 3.5, 4.5])
>>> b = np.around(a) >>> b # still floating-point array([ 1., 2., 2., 2., 4., 4.]) >>> c = np.around(a).astype(int) >>> c array([1, 2, 2, 2, 4, 4])

2、Different data type sizes - 不同數據類型的大小

有符號整型 int8 8 bits
int16 16 bits
int32 32 bits(32位平臺上 int 型默認大小)
int64 64 bits(64位平臺上 int 型默認大小)
無符號整型 uint8 8 bits
uint16 16 bits
uint32 32 bits
uint64 64 bits
浮點型 float16 16 bits
float32 32 bits
float64 64 bits(float 默認大小)
float96 96 bits, platform-dependent(與 np.longdouble 相同)
float128 128 bits, platform-dependent(與 np.longdouble 相同)
復數浮點型 complex64 two 32-bit floats
complex128 two 64-bit floats
complex192 two 96-bit floats, platform-dependent
complex256 two 128-bit floats, platform-dependent

二、結構化數據類型

sensor_code (4-character string)
position (float)
value (float)

>>> samples = np.zeros((6,), dtype=[(sensor_code, S4),
...                                 (position, float), (value, float)])
>>> samples.ndim
1
>>> samples.shape
(6,)
>>> samples.dtype.names
(sensor_code, position, value)

>>> samples[:] = [(ALFA,   1, 0.37), (BETA, 1, 0.11), (TAU, 1,   0.13),
...               (ALFA, 1.5, 0.37), (ALFA, 3, 0.11), (TAU, 1.2, 0.13)]
>>> samples     
array([(ALFA, 1.0, 0.37), (BETA, 1.0, 0.11), (TAU, 1.0, 0.13),
       (ALFA, 1.5, 0.37), (ALFA, 3.0, 0.11), (TAU, 1.2, 0.13)],
      dtype=[(sensor_code, S4), (position, <f8), (value, <f8)])

# 使用列名進行索引
>>> samples[sensor_code]    
array([ALFA, BETA, TAU, ALFA, ALFA, TAU],
      dtype=|S4)
>>> samples[value]
array([ 0.37,  0.11,  0.13,  0.37,  0.11,  0.13])
>>> samples[0]    
(ALFA, 1.0, 0.37)

>>> samples[0][sensor_code] = TAU
>>> samples[0]    
(TAU, 1.0, 0.37)

# 同時獲取多列
>>> samples[[position, value]]
array([(1.0, 0.37), (1.0, 0.11), (1.0, 0.13), (1.5, 0.37), (3.0, 0.11),
       (1.2, 0.13)],
      dtype=[(position, <f8), (value, <f8)])

# 花式索引同樣適用
>>> samples[samples[sensor_code] == ALFA]    
array([(ALFA, 1.5, 0.37), (ALFA, 3.0, 0.11)],
      dtype=[(sensor_code, S4), (position, <f8), (value, <f8)])

更多信息請參考:https://docs.scipy.org/doc/numpy/user/basics.rec.html

https://docs.scipy.org/doc/numpy/reference/arrays.dtypes.html#specifying-and-constructing-data-types

三、maskedarray: dealing with (propagation of) missing data - 蒙面數組:缺失值的處理

對於浮點型數據來說,我們可以使用NaN來處理缺失值,但是面具可以處理任何類型的數據的缺失值。

>>> x = np.ma.array([1, 2, 3, 4], mask=[0, 1, 0, 1])
>>> x
masked_array(data = [1 -- 3 --],
             mask = [False  True False  True],    
       fill_value = 999999)

>>> y = np.ma.array([1, 2, 3, 4], mask=[0, 1, 1, 1])   # 0代表False,表示沒有面具,也就是不會被當作不可用的數據
>>> y
masked_array(data = [1 -- -- --],
             mask = [False  True  True  True],
       fill_value = 999999)

>>> x + y
masked_array(data = [2 -- -- --],
             mask = [False  True  True  True],
       fill_value = 999999)

NumPy學習筆記:3、更加復雜的數組