iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 9
0

前言

今天是鐵人賽的第九天,前天介紹了如何建立Numpy的陣列,和陣列的一些基本屬性(size、shape...),和兩個以上的陣列可以如何合併和分割。昨天介紹了陣列的一些運算(sum、min、max..),陣列的broadcasting特性,還有使用運算子和遮罩的特性取得想要的元素。今天持續要來介紹Numpy

  • Fancy索引
  • sort
  • structured array

Fancy索引

費氏的觀念就是傳遞一個陣列當作index去取得元素。以下面的程式當作例子:

  • 一維陣列
    1. 先建立一個一維陣列
import numpy as np
x = np.random.randint(0,100,size = 10)
print('x----------->',x)
# 輸出結果
x-----------> [66 74 84 13 37 83 58 90 84 23]
  1. 假設要取4個不同的元素
[x[0],x[3],x[2],x[6]]
# 輸出結果
[66, 13, 84, 58]
  1. 使用fancy索引取出元素,這邊需要注意的是ironman輸出的結果會是以給予的index陣列為shape而不是以x為shape
ironman = np.array([
    [0,3],
    [2,6]
])
x[ironman]
# 輸出結果
array([[66, 13],
       [84, 58]])
  • 多維陣列
    建立一個3*4的陣列,並使用fancy索引取得元素
y = np.random.randint(0,100,(3,4))
print('y-------->',y)
row = np.array([0,1,2])
col = np.array([2,1,3])
print('y[row,col]----->',y[row,col])
# 輸出結果
y--------> [[65 76 49 29]
 [24 96 13 20]
 [91 58 37 24]]
y[row,col]-----> [49 96 24]

# 49-> 第0 row,第2 col 
# 96-> 第1 row,第1 col 
# 24-> 第2 row,第3 col 
  • fancy的廣播效果
newRow = row[:, np.newaxis]
print('newRow----->',newRow)
print('y[newRow,col]----->',y[newRow,col])
# 輸出結果
newRow-----> [[0]
 [1]
 [2]]
y[newRow,col]-----> [[49 76 29]
 [13 96 20]
 [37 58 24]]
 
 #[49,13,37] 第0~2 row ,第2 col 
 #[76,96,58] 第0~2 row ,第1 col 
 #[29,20,24] 第0~2 row ,第3 col 
  • 使用fancy索引修改元素
x = np.random.randint(0,100,size = 10)
print('x--------------->',x)
i = np.array([2,1,5,7])
print('i--------------->',i)
x[i] = 33
print('x--------------->',x)
# 輸出結果
x---------------> [91 38 11 54 82 67 63  4  7 34]
i---------------> [2 1 5 7]
x---------------> [91 33 33 54 82 33 63 33  7 34]
#可以看到index 1,2,5,7 已經被改成33

陣列排序:sort()

將陣列從小到大做排序

x = np.random.randint(0,100,size = 10) #隨機產生陣列,沒有排序
print('x--------------->',x)
x.sort()
print('x--------------->',x)
# 輸出結果
x---------------> [15 85 51 98 65 43 78 61 85 17]
x---------------> [15 17 43 51 61 65 78 85 85 98]
  • argsort():傳回被排序過的索引值
x = np.random.randint(0,100,size = 5)
print('x--------------->',x)
print('np.argsort(x)--------------->',np.argsort(x))
# 輸出結果
x---------------> [40 22 91 18 74]
np.argsort(x)---------------> [3 1 0 4 2]
# x排序過後會變成 [18 22 40 74 91]
# 18在x的index為 3
# 22在x的index為 1
# 40在x的index為 0
# 74在x的index為 4
# 91在x的index為 2 -> [3 1 0 4 2]
  • 針對欄或列做排序
    剛剛都是示範全部的元素做排序,但Numpy可以針對欄或列做排序,以下示範針對每一欄做排序
x = np.random.randint(0,100,(4,4))
print('x--------------->',x)
np.sort(x,axis=0)
# 輸出結果
x---------------> [[72 22 23 27]
 [50 39 78  3]
 [91 27 12 47]
 [75 75 78 94]]
array([[50, 22, 12,  3],
       [72, 27, 23, 27],
       [75, 39, 78, 47],
       [91, 75, 78, 94]])
# [72 50 91 75] 排序後 [50 72 75 91]
# [22 39 27 75] 排序後 [22 27 39 75]
# [23 78 12 78] 排序後 [12 23 78 78]
# [27 3 47 84] 排序後 [3 27 47 94]
  • 部分排序:Partitioning
    以下示範陣列中最小的四個排在左側(順序沒有排序),其他元素放右側(順序沒有排序),只是單純選出最小四個元素放在左邊
x = np.random.randint(0,50,size=10)
print('x--------------->',x)
np.partition(x,4)
# 輸出結果
x---------------> [48 29 38 24  9 46  6 29  3 21]
array([ 6,  9,  3, 21, 24, 29, 29, 46, 38, 48])

結構化的資料(structured array)

numpy的資料型態有以下幾種:

字元 說明
b 位元組
i 有號整數
u 無號整數
f 浮點數
c 複數浮點數
S,a 字串
U unicode字串
v void
  • create
    以下示範如何建立結構化的資料
team =np.zeros(4, dtype={'names':('name','number','team'),'formats':('U10','i2','U10')})
# 建立標題name 資料型別是unicode字串 長度10
# 建立標題number 資料型別是有號整數 長度2
# 建立標題team 資料型別是unicode字串 長度10
print('team.dtype------------>',team.dtype)
team['name'] =['彭政閔','林智勝','蘇偉達','陽耀勳']
team['number'] = [23,32,96,23]
team['team'] = ['兄弟象','兄弟象','兄弟象','lamigo']
print('team------------>',team)
# 輸出結果
team.dtype------------> [('name', '<U10'), ('number', '<i2'), ('team', '<U10')]
team------------> [('彭政閔', 23, '兄弟象') ('林智勝', 32, '兄弟象') ('蘇偉達', 96, '兄弟象')
 ('陽耀勳', 23, 'lamigo')]
  • get
    只取得背號的方法
print(team['number'])
# 輸出結果
[23 32 96 23]

之前的章節導覽


上一篇
[Day08]Learning Numpy - Ufuncs、broadcasting、運算子
下一篇
[Day10]Learning Pandas - Series、DataFrame、Index
系列文
python 入門到分析股市30

尚未有邦友留言

立即登入留言