---
# System prepended metadata

title: 'Numpy #7 陣列結構'
tags: [python, 資料分析, numpy]

---

# Numpy #7 陣列結構

## NP 資料型別

![](https://i.imgur.com/OHCW4Cv.png)

指定各欄位的資料型別
變數dt = np.dtype('N0, N1, N2, ...')
N0 N1...各自代表這些欄位的型別

可以用上表的字母部分顯示
例如f8代表8bytes float(float64)；U5代表長度5以下的unicode

也可以用上表的NP通用型別
例如np.int32 

讀取文檔的時候，上面變數dt就可以用參數dtype=dt指定
例如 a = np.genfromtxt('test.txt', delimiter=',',  dtype=dt)

## 結構化陣列

可用指定dic的方式

舉例:
原始資料 test.txt
Jay,1,2,Yes,87%
James,3,4,No,3%
Joe,5,6,Yes,55%

dt = np.dtype({'names':('Name', 'num1', 'num2', 'True'), 'formats':((np.str_, 5), np.int32, int, 'U3')})

前半代表欄位名稱，後半則分別指定類別（上表都可混用）

整理資料可輸入
b = np.genfromtxt("test.txt", delimiter=',', dtype=dt)

可用索引提取資料，例如
b[0]代表第一列資料
b['name']則提取該欄位名稱的資料
或是b[0]['name'］得到某列某欄位的資料

也可以加入邏輯運算，例如
b[b['num2'] >= 3]['Name']
　欄位名　　　>=3的欄 輸出的欄位名

## 清單餵入結構化陣列

建立3X3 zero矩陣，利用上面dt的dtype
c = np.zeros(3, dtype=dt)

結果
array([('', 0, 0, ''), ('', 0, 0, ''), ('', 0, 0, '')],
      dtype=[('Name', '<U5'), ('num1', '<i4'), ('num2', '<i8'), ('True', '<U3')])

清單
name = ['Chloe', 'Charlotte', 'Clara']
num_1 = [11, 12, 13]
num_2 = [14, 15, 16]
check = ['Y', 'Y', 'N']

各自清單置入原來的欄位裡面
c['Name'] = name
c['num1'] = num_1
c['num2'] = num_2
c['True'] = check

結果
[('Chloe', 11, 14, 'Y') ('Charl', 12, 15, 'Y') ('Clara', 13, 16, 'N')]


更多可以參考：
https://numpy.org/doc/stable/user/basics.rec.html

###### tags: `資料分析` `numpy` `python` 