實踐作業

qq_47718334發表於2020-12-02

本次練習使用 鳶尾屬植物資料集 .\iris.data ,在這個資料集中,包括了三類不同的鳶尾屬植物: Iris Setosa,Iris Versicolour,Iris Virginica。每類收集了50個樣本,因此這個資料集一共包含了 150個樣本。
sepallength:萼片長度
sepalwidth:萼片寬度
petallength:花瓣長度
petalwidth:花瓣寬度

  1. 匯入鳶尾屬植物資料集,保持文字不變。
import numpy as np 
outfile = r'.\iris.data' 
iris_data = np.loadtxt(outfile, dtype=object, delimiter=',', skiprows=1) 
print(iris_data[0:10])
  1. 求出鳶尾屬植物萼片長度的平均值、中位數和標準差(第1列,sepallength) 【知識點:統計相關】 如何計算numpy陣列的均值,中位數,標準差?
import numpy as np 
outfile = r'.\iris.data' 
sepalLength = np.loadtxt(outfile, dtype=float, delimiter=',', skiprows=1, usecols=[0]) 
print(sepalLength[0:10]) # [5.1 4.9 4.7 4.6 5. 5.4 4.6 5. 4.4 4.9] 
print(np.mean(sepalLength)) # 5.843333333333334 
print(np.median(sepalLength)) # 5.8
print(np.std(sepalLength))
# 0.8253012917851409
  1. 建立一種標準化形式的鳶尾屬植物萼片長度,其值正好介於0和1之間,這樣最小值為0,最大值為 1(第1列,sepallength)。
import numpy as np 
outfile = r'.\iris.data' 
sepalLength = np.loadtxt(outfile, dtype=float, delimiter=',', skiprows=1, usecols=[0]) 
# 方法1 
aMax = np.amax(sepalLength) 
aMin = np.amin(sepalLength) 
x = (sepalLength ‐ aMin) / (aMax ‐ aMin) 
print(x[0:10])
# [0.22222222 0.16666667 0.11111111 0.08333333 0.19444444 0.30555556 
# 0.08333333 0.19444444 0.02777778 0.16666667] 
# 方法2 x = (sepalLength ‐ aMin) / np.ptp(sepalLength) 
print(x[0:10]) 
# [0.22222222 0.16666667 0.11111111 0.08333333 0.19444444 0.30555556 
# 0.08333333 0.19444444 0.02777778 0.16666667]
  1. 找到鳶尾屬植物萼片長度的第5和第95百分位數(第1列,sepallength)。
import numpy as np 
outfile = r'.\iris.data' 
sepalLength = np.loadtxt(outfile, dtype=float, delimiter=',', skiprows=1, usecols=[0]) 
x = np.percentile(sepalLength, [5, 95]) 
print(x) # [4.6 7.255]
  1. 把iris_data資料集中的20個隨機位置修改為np.nan值
import numpy as np 
outfile = r'.\iris.data' 
# 方法1 
iris_data = np.loadtxt(outfile, dtype=object, delimiter=',', skiprows=1) 
i, j = iris_data.shape np.random.seed(20200621) iris_data[np.random.randint(i, size=20), np.random.randint(j, size=20)] = np.nan 
print(iris_data[0:10])
# 方法2 
iris_data = np.loadtxt(outfile, dtype=object, delimiter=',', skiprows=1) 
i, j = iris_data.shape np.random.seed(20200620) iris_data[np.random.choice(i, size=20), np.random.choice(j, size=20)] = np.nan 
print(iris_data[0:10])
  1. 在iris_data的sepallength中查詢缺失值的個數和位置(第1列)。
import numpy as np 
outfile = r'.\iris.data' 
iris_data = np.loadtxt(outfile, dtype=float, delimiter=',', skiprows=1, usecols=[0, 1, 2,
3]) 
i, j = iris_data.shape np.random.seed(20200621) iris_data[np.random.randint(i, size=20), np.random.randint(j, size=20)] = np.nan 
sepallength = iris_data[:, 0] 
x = np.isnan(sepallength) 
print(sum(x)) # 6 
print(np.where(x)) 
# (array([ 26, 44, 55, 63, 90, 115], dtype=int64),)
  1. 篩選具有 sepallength(第1列)< 5.0 並且 petallength(第3列)> 1.5 的 iris_data行。
import numpy as np 
outfile = r'.\iris.data' 
iris_data = np.loadtxt(outfile, dtype=float, delimiter=',', skiprows=1, usecols=[0, 1, 2, 3]) 
sepallength = iris_data[:, 0] 
petallength = iris_data[:, 2] index = np.where(np.logical_and(petallength > 1.5, sepallength < 5.0)) print(iris_data[index])
  1. 選擇沒有任何 nan 值的 iris_data行
import numpy as np 
outfile = r'.\iris.data' 
iris_data = np.loadtxt(outfile, dtype=float, delimiter=',', skiprows=1, usecols=[0, 1, 2, 3]) 
i, j = iris_data.shape np.random.seed(20200621) iris_data[np.random.randint(i, size=20), np.random.randint(j, size=20)] = np.nan 
x = iris_data[np.sum(np.isnan(iris_data), axis=1) == 0] print(x[0:10])
  1. 計算 iris_data 中sepalLength(第1列)和petalLength(第3列)之間的相關係數。
import numpy as np 
outfile = r'.\iris.data' 
iris_data = np.loadtxt(outfile, dtype=float, delimiter=',', skiprows=1, usecols=[0, 1, 2, 3]) 
sepalLength = iris_data[:, 0] 
petalLength = iris_data[:, 2] 
# 方法1 
m1 = np.mean(sepalLength) 
m2 = np.mean(petalLength) 
cov = np.dot(sepalLength ‐ m1, petalLength ‐ m2) 
std1 = np.sqrt(np.dot(sepalLength ‐ m1, sepalLength ‐ m1)) 
std2 = np.sqrt(np.dot(petalLength ‐ m2, petalLength ‐ m2)) print(cov / (std1 * std2)) # 0.8717541573048712
# 方法2 
x = np.mean((sepalLength ‐ m1) * (petalLength ‐ m2)) 
y = np.std(sepalLength) * np.std(petalLength) 
print(x / y) # 0.8717541573048712
# 方法3 
x = np.cov(sepalLength, petalLength, ddof=False) 
y = np.std(sepalLength) * np.std(petalLength) 
print(x[0, 1] / y) # 0.8717541573048716
# 方法4 
x = np.corrcoef(sepalLength, petalLength) 
print(x) 
# [[1. 0.87175416] # [0.87175416 1. ]]
  1. 找出iris_data是否有任何缺失值。
import numpy as np 
outfile = r'.\iris.data' 
iris_data = np.loadtxt(outfile, dtype=float, delimiter=',', skiprows=1, usecols=[0, 1, 2, 3]) 
x = np.isnan(iris_data) 
print(np.any(x)) # False
  1. 在numpy陣列中將所有出現的nan替換為0。
import numpy as np 
outfile = r'.\iris.data' 
iris_data = np.loadtxt(outfile, dtype=float, delimiter=',', skiprows=1, usecols=[0, 1, 2, 3]) 
i, j = iris_data.shape np.random.seed(20200621) iris_data[np.random.randint(i, size=20), np.random.randint(j, size=20)] = np.nan 
iris_data[np.isnan(iris_data)] = 0 
print(iris_data[0:10])
  1. 找出鳶尾屬植物物種中的唯一值和唯一值出現的數量。
import numpy as np
outfile = r'.\iris.data' 
iris_data = np.loadtxt(outfile, dtype=object, delimiter=',', skiprows=1, usecols=[4]) 
x = np.unique(iris_data, return_counts=True) 
print(x) 
# (array(['Iris‐setosa', 'Iris‐versicolor', 'Iris‐virginica'], dtype=object), array([50, 50, 50], dtype=int64))
  1. 將 iris_data 的花瓣長度(第3列)以形成分類變數的形式顯示。定義:Less than 3 --> ‘small’;3-5 --> ‘medium’;’>=5 --> ‘large’。
import numpy as np 
outfile = r'.\iris.data' 
iris_data = np.loadtxt(outfile, dtype=float, delimiter=',', skiprows=1, usecols=[0, 1, 2, 3]) 
petal_length_bin = np.digitize(iris_data[:, 2], [0, 3, 5, 10]) label_map = {1: 'small', 2: 'medium', 3: 'large', 4: np.nan} petal_length_cat = [label_map[x] for x in petal_length_bin] print(petal_length_cat[0:10]) 
# ['small', 'small', 'small', 'small', 'small', 'small', 'small', 'small', 'small', 'small']
  1. 在 iris_data 中建立一個新列,其中 volume 是 (pi x petallength x sepallength ^ 2)/ 3 。
import numpy as np 
outfile = r'.\iris.data' 
iris_data = np.loadtxt(outfile, dtype=object, delimiter=',', skiprows=1) 
sepalLength = iris_data[:, 0].astype(float) 
petalLength = iris_data[:, 2].astype(float) 
volume = (np.pi * petalLength * sepalLength ** 2) / 3 
volume = volume[:, np.newaxis] 
iris_data = np.concatenate([iris_data, volume], axis=1) print(iris_data[0:10])
  1. 隨機抽鳶尾屬植物的種類,使得Iris-setosa的數量是Iris-versicolor和Iris-virginica數量的兩 倍。
import numpy as np 
species = np.array(['Iris‐setosa', 'Iris‐versicolor', 'Iris‐virginica']) 
species_out = np.random.choice(species, 10000, p=[0.5, 0.25, 0.25]) 
print(np.unique(species_out, return_counts=True)) # (array(['Iris‐setosa', 'Iris‐versicolor', 'Iris‐virginica'], dtype='<U15'), array([4927, 2477, 2596], dtype=int64))
  1. 根據 sepallength 列對資料集進行排序。
import numpy as np 
outfile = r'.\iris.data' 
iris_data = np.loadtxt(outfile, dtype=object, delimiter=',', skiprows=1) 
sepalLength = iris_data[:, 0] 
index = np.argsort(sepalLength) 
print(iris_data[index][0:10])
  1. 在鳶尾屬植物資料集中找到最常見的花瓣長度值(第3列)。
import numpy as np 
outfile = r'.\iris.data' 
iris_data = np.loadtxt(outfile, dtype=object, delimiter=',', skiprows=1) 
petalLength = iris_data[:, 2] 
vals, counts = np.unique(petalLength, return_counts=True) print(vals[np.argmax(counts)]) # 1.5 
print(np.amax(counts)) # 14
  1. 在鳶尾花資料集的 petalwidth(第4列)中查詢第一次出現的值大於1.0的位置。
import numpy as np 
outfile = r'.\iris.data' 
iris_data = np.loadtxt(outfile, dtype=float, delimiter=',', skiprows=1, usecols=[0, 1, 2, 3]) 
petalWidth = iris_data[:, 3] 
index = np.where(petalWidth > 1.0) 
print(index) 
print(index[0][0]) # 50

相關文章