科學計算工具Numpy

文章來源:Python數據分析html

###目錄:python

參考學習資料:git

#1.ndarray的建立與數據類型 ##1.Numpy(Numerical Python) **Numpy:**提供了一個在Python中作科學計算的基礎庫,重在數值計算,主要用於多維數組(矩陣)處理的庫。用來存儲和處理大型矩陣,比Python自身的嵌套列表結構要高效的多。自己是由C語言開發,是個很基礎的擴展,Python其他的科學計算擴展大部分都是以此爲基礎。github

  • 高性能科學計算和數據分析的基礎包編程

  • ndarray,多維數組(矩陣),具備矢量運算能力,快速、節省空間數組

  • 矩陣運算,無需循環,可完成相似Matlab中的矢量運算bash

  • 線性代數、隨機數生成dom

  • import numpy as npide

##2.ndarray 多維數組(N Dimension Array) NumPy數組是一個多維的數組對象(矩陣),稱爲ndarray,具備矢量算術運算能力和複雜的廣播能力,並具備執行速度快和節省空間的特色。函數

注意:ndarray的下標從0開始,且數組裏的全部元素必須是相同類型

###ndarray擁有的屬性

ndim屬性:維度個數 shape屬性:維度大小 dtype屬性:數據類型

##ndarray的隨機建立 經過隨機抽樣 (numpy.random) 生成隨機數據。

示例代碼:

# 導入numpy,別名np
import numpy as np

# 生成指定維度大小(3行4列)的隨機多維浮點型數據(二維),rand固定區間0.0 ~ 1.0
arr = np.random.rand(3, 4)
print(arr)
print(type(arr))

# 生成指定維度大小(3行4列)的隨機多維整型數據(二維),randint()能夠指定區間(-1, 5)
arr = np.random.randint(-1, 5, size = (3, 4)) # 'size='可省略
print(arr)
print(type(arr))

# 生成指定維度大小(3行4列)的隨機多維浮點型數據(二維),uniform()能夠指定區間(-1, 5)
arr = np.random.uniform(-1, 5, size = (3, 4)) # 'size='可省略
print(arr)
print(type(arr))

print('維度個數: ', arr.ndim)
print('維度大小: ', arr.shape)
print('數據類型: ', arr.dtype)
複製代碼

運行結果:

[[ 0.09371338  0.06273976  0.22748452  0.49557778]
 [ 0.30840042  0.35659161  0.54995724  0.018144  ]
 [ 0.94551493  0.70916088  0.58877255  0.90435672]]
<class 'numpy.ndarray'>

[[ 1  3  0  1]
 [ 1  4  4  3]
 [ 2  0 -1 -1]]
<class 'numpy.ndarray'>

[[ 2.25275308  1.67484038 -0.03161878 -0.44635706]
 [ 1.35459097  1.66294159  2.47419548 -0.51144655]
 [ 1.43987571  4.71505054  4.33634358  2.48202309]]
<class 'numpy.ndarray'>

維度個數:  2
維度大小:  (3, 4)
數據類型:  float64
複製代碼

##3.ndarray的序列建立 ###1. np.array(collection)

collection 爲 序列型對象(list)、嵌套序列對象(list of list)。 示例代碼:

# list序列轉換爲 ndarray
lis = range(10)
arr = np.array(lis)

print(arr)            # ndarray數據
print(arr.ndim)        # 維度個數
print(arr.shape)    # 維度大小

# list of list嵌套序列轉換爲ndarray
lis_lis = [range(10), range(10)]
arr = np.array(lis_lis)

print(arr)            # ndarray數據
print(arr.ndim)        # 維度個數
print(arr.shape)    # 維度大小
複製代碼

運行結果:

# list序列轉換爲 ndarray
[0 1 2 3 4 5 6 7 8 9]
1
(10,)

# list of list嵌套序列轉換爲 ndarray
[[0 1 2 3 4 5 6 7 8 9]
 [0 1 2 3 4 5 6 7 8 9]]
2
(2, 10)
複製代碼

###2. np.zeros()

指定大小的全0數組。注意:第一個參數是元組,用來指定大小,如(3, 4)。

###3. np.ones()

指定大小的全1數組。注意:第一個參數是元組,用來指定大小,如(3, 4)。

###4. np.empty()

初始化數組,不是老是返回全0,有時返回的是未初始的隨機值(內存裏的隨機值)。

示例代碼:

# np.zeros
zeros_arr = np.zeros((3, 4))

# np.ones
ones_arr = np.ones((2, 3))

# np.empty
empty_arr = np.empty((3, 3))

# np.empty 指定數據類型
empty_int_arr = np.empty((3, 3), int)

print('------zeros_arr-------')
print(zeros_arr)

print('\n------ones_arr-------')
print(ones_arr)

print('\n------empty_arr-------')
print(empty_arr)

print('\n------empty_int_arr-------')
print(empty_int_arr)
複製代碼

運行結果:

------zeros_arr-------
[[ 0.  0.  0.  0.]
 [ 0.  0.  0.  0.]
 [ 0.  0.  0.  0.]]

------ones_arr-------
[[ 1.  1.  1.]
 [ 1.  1.  1.]]

------empty_arr-------
[[ 0.  0.  0.]
 [ 0.  0.  0.]
 [ 0.  0.  0.]]

------empty_int_arr-------
[[0 0 0]
 [0 0 0]
 [0 0 0]]
複製代碼

###5. np.arange() 和 reshape()

arange() 相似 python 的 range() ,建立一個一維 ndarray 數組。

reshape() 將 從新調整數組的維數。

示例代碼:

# np.arange()
arr = np.arange(15) # 15個元素的 一維數組
print(arr)
print(arr.reshape(3, 5)) # 3x5個元素的 二維數組
print(arr.reshape(1, 3, 5)) # 1x3x5個元素的 三維數組
複製代碼

運行結果:

[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14]

[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]]

[[[ 0  1  2  3  4]
  [ 5  6  7  8  9]
  [10 11 12 13 14]]]
複製代碼

###6. np.arange() 和 random.shuffle()

random.shuffle() 將打亂數組序列(相似於洗牌)。

示例代碼:

arr = np.arange(15)
print(arr)

np.random.shuffle(arr)
print(arr)
print(arr.reshape(3,5))
複製代碼

運行結果:

[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14]

[ 5  8  1  7  4  0 12  9 11  2 13 14 10  3  6]

[[ 5  8  1  7  4]
 [ 0 12  9 11  2]
 [13 14 10  3  6]]
複製代碼

##4.ndarray的數據類型 ###1. dtype參數

指定數組的數據類型,類型名+位數,如float64, int32 ###2.astype方法 轉換數組的數據類型

示例代碼:

# 初始化3行4列數組,數據類型爲float64
zeros_float_arr = np.zeros((3, 4), dtype=np.float64)
print(zeros_float_arr)
print(zeros_float_arr.dtype)

# astype轉換數據類型,將已有的數組的數據類型轉換爲int32
zeros_int_arr = zeros_float_arr.astype(np.int32)
print(zeros_int_arr)
print(zeros_int_arr.dtype)
複製代碼

運行結果:

[[ 0.  0.  0.  0.]
 [ 0.  0.  0.  0.]
 [ 0.  0.  0.  0.]]
float64

[[0 0 0 0]
 [0 0 0 0]
 [0 0 0 0]]
int32
複製代碼


#2.ndarray的矩陣運算

數組是編程中的概念,矩陣、矢量是數學概念。

在計算機編程中,矩陣能夠用數組形式定義,矢量能夠用結構定義! ##1. 矢量運算:相同大小的數組間運算應用在元素上

示例代碼:

# 矢量與矢量運算
arr = np.array([[1, 2, 3],
                [4, 5, 6]])

print("元素相乘:")
print(arr * arr)

print("矩陣相加:")
print(arr + arr)
複製代碼

運行結果:

元素相乘:
[[ 1  4  9]
 [16 25 36]]

矩陣相加:
[[ 2  4  6]
 [ 8 10 12]]
複製代碼

##2. 矢量和標量運算:"廣播" - 將標量"廣播"到各個元素

示例代碼:

# 矢量與標量運算
print(1. / arr)
print(2. * arr)
複製代碼

運行結果:

[[ 1.          0.5         0.33333333]
 [ 0.25        0.2         0.16666667]]

[[  2.   4.   6.]
 [  8.  10.  12.]]
複製代碼

#ndarray的索引與切片

###1. 一維數組的索引與切片

與Python的列表索引功能類似

示例代碼:

# 一維數組
arr1 = np.arange(10)
print(arr1)
print(arr1[2:5])
複製代碼

運行結果:

[0 1 2 3 4 5 6 7 8 9]
[2 3 4]
複製代碼

###2. 多維數組的索引與切片:

arr[r1:r2, c1:c2]

arr[1,1] 等價 arr[1][1]

[:] 表明某個維度的數據

示例代碼:

# 多維數組
arr2 = np.arange(12).reshape(3,4)
print(arr2)

print(arr2[1])

print(arr2[0:2, 2:])

print(arr2[:, 1:3])
複製代碼

運行結果:

[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]

[4 5 6 7]

[[2 3]
 [6 7]]

[[ 1  2]
 [ 5  6]
 [ 9 10]]
複製代碼

###3. 條件索引

布爾值多維數組:arr[condition],condition也能夠是多個條件組合。

注意,多個條件組合要使用 & | 鏈接,而不是Python的 and or。

示例代碼:

# 條件索引

# 找出 data_arr 中 2005年後的數據
data_arr = np.random.rand(3,3)
print(data_arr)

year_arr = np.array([[2000, 2001, 2000],
                     [2005, 2002, 2009],
                     [2001, 2003, 2010]])

is_year_after_2005 = year_arr >= 2005
print(is_year_after_2005, is_year_after_2005.dtype)

filtered_arr = data_arr[is_year_after_2005]
print(filtered_arr)

#filtered_arr = data_arr[year_arr >= 2005]
#print(filtered_arr)

# 多個條件
filtered_arr = data_arr[(year_arr <= 2005) & (year_arr % 2 == 0)]
print(filtered_arr)
複製代碼

運行結果:

[[ 0.53514038  0.93893429  0.1087513 ]
 [ 0.32076215  0.39820313  0.89765765]
 [ 0.6572177   0.71284822  0.15108756]]

[[False False False]
 [ True False  True]
 [False False  True]] bool

[ 0.32076215  0.89765765  0.15108756]

#[ 0.32076215 0.89765765 0.15108756]

[ 0.53514038  0.1087513   0.39820313]
複製代碼

##ndarray的維數轉換

二維數組直接使用轉換函數:transpose()

高維數組轉換要指定維度編號參數 (0, 1, 2, …),注意參數是元組

示例代碼:

arr = np.random.rand(2,3)    # 2x3 數組
print(arr)    
print(arr.transpose()) # 轉換爲 3x2 數組


arr3d = np.random.rand(2,3,4) # 2x3x4 數組,2對應0,3對應1,4對應2
print(arr3d)
print(arr3d.transpose((1,0,2))) # 根據維度編號,轉爲爲 3x2x4 數組
複製代碼

運行結果:

# 二維數組轉換
# 轉換前:
[[ 0.50020075  0.88897914  0.18656499]
 [ 0.32765696  0.94564495  0.16549632]]

# 轉換後:
[[ 0.50020075  0.32765696]
 [ 0.88897914  0.94564495]
 [ 0.18656499  0.16549632]]


# 高維數組轉換
# 轉換前:
[[[ 0.91281153  0.61213743  0.16214062  0.73380458]
  [ 0.45539155  0.04232412  0.82857746  0.35097793]
  [ 0.70418988  0.78075814  0.70963972  0.63774692]]

 [[ 0.17772347  0.64875514  0.48422954  0.86919646]
  [ 0.92771033  0.51518773  0.82679073  0.18469917]
  [ 0.37260457  0.49041953  0.96221477  0.16300198]]]

# 轉換後:
[[[ 0.91281153  0.61213743  0.16214062  0.73380458]
  [ 0.17772347  0.64875514  0.48422954  0.86919646]]

 [[ 0.45539155  0.04232412  0.82857746  0.35097793]
  [ 0.92771033  0.51518773  0.82679073  0.18469917]]

 [[ 0.70418988  0.78075814  0.70963972  0.63774692]
  [ 0.37260457  0.49041953  0.96221477  0.16300198]]]
複製代碼


#3.ndarray的元素處理

元素計算函數

ceil(): 向上最接近的整數,參數是 number 或 array

floor():向下最接近的整數,參數是 number 或 array

rint(): 四捨五入,參數是 number 或 array isnan(): 判斷元素是否爲 NaN(Not a Number),參數是 number 或 array multiply(): 元素相乘,參數是 number 或 array divide(): 元素相除,參數是 number 或 array abs():元素的絕對值,參數是 number 或 array where(condition, x, y):三元運算符,x if condition else y 示例代碼:

# randn() 返回具備標準正態分佈的序列。
arr = np.random.randn(2,3)

print(arr)

print(np.ceil(arr))

print(np.floor(arr))

print(np.rint(arr))

print(np.isnan(arr))

print(np.multiply(arr, arr))

print(np.divide(arr, arr))

print(np.where(arr > 0, 1, -1))
複製代碼

運行結果:

# print(arr)
[[-0.75803752  0.0314314   1.15323032]
 [ 1.17567832  0.43641395  0.26288021]]

# print(np.ceil(arr))
[[-0.  1.  2.]
 [ 2.  1.  1.]]

# print(np.floor(arr))
[[-1.  0.  1.]
 [ 1.  0.  0.]]

# print(np.rint(arr))
[[-1.  0.  1.]
 [ 1.  0.  0.]]

# print(np.isnan(arr))
[[False False False]
 [False False False]]

# print(np.multiply(arr, arr))
[[  5.16284053e+00   1.77170104e+00   3.04027254e-02]
 [  5.11465231e-03   3.46109263e+00   1.37512421e-02]]

# print(np.divide(arr, arr))
[[ 1.  1.  1.]
 [ 1.  1.  1.]]

# print(np.where(arr > 0, 1, -1))
[[ 1  1 -1]
 [-1  1  1]]
複製代碼

元素統計函數

1 .np.mean(), np.sum():全部元素的平均值,全部元素的和,參數是 number 或 array

2 .np.max(), np.min():全部元素的最大值,全部元素的最小值,參數是 number 或 array

3 .np.std(), np.var():全部元素的標準差,全部元素的方差,參數是 number 或 array 4 .np.argmax(), np.argmin():最大值的下標索引值,最小值的下標索引值,參數是 number 或 array 5 .np.cumsum(), np.cumprod():返回一個一維數組,每一個元素都是以前全部元素的 累加和 和 累乘積,參數是 number 或 array **6 .**多維數組默認統計所有維度,axis參數能夠按指定軸心統計,值爲0則按列統計,值爲1則按行統計。 示例代碼:

arr = np.arange(12).reshape(3,4)
print(arr)

print(np.cumsum(arr)) # 返回一個一維數組,每一個元素都是以前全部元素的 累加和

print(np.sum(arr)) # 全部元素的和

print(np.sum(arr, axis=0)) # 數組的按列統計和

print(np.sum(arr, axis=1)) # 數組的按行統計和
複製代碼

運行結果:

# print(arr)
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]

# print(np.cumsum(arr)) 
[ 0  1  3  6 10 15 21 28 36 45 55 66]

# print(np.sum(arr)) # 全部元素的和
66

# print(np.sum(arr, axis=0)) # 0表示對數組的每一列的統計和
[12 15 18 21]

# print(np.sum(arr, axis=1)) # 1表示數組的每一行的統計和
[ 6 22 38]
複製代碼

#元素判斷函數

1 .np.any(): 至少有一個元素知足指定條件,返回True 2 .np.all(): 全部的元素知足指定條件,返回True

示例代碼:

arr = np.random.randn(2,3)
print(arr)

print(np.any(arr > 0))
print(np.all(arr > 0))
複製代碼

運行結果:

[[ 0.05075769 -1.31919688 -1.80636984]
 [-1.29317016 -1.3336612  -0.19316432]]

True
False
複製代碼

#元素去重排序函數

np.unique():找到惟一值並返回排序結果,相似於Python的set集合

示例代碼:

arr = np.array([[1, 2, 1], [2, 3, 4]])
print(arr)

print(np.unique(arr))
複製代碼

運行結果:

[[1 2 1]
 [2 3 4]]

[1 2 3 4]
複製代碼


#4.2016年美國總統大選民意調查數據統計

  • 項目地址:www.kaggle.com/fivethirtye…

  • 該數據集包含了2015年11月至2016年11月期間對於2016美國大選的選票數據,共27列數據

#示例代碼1 :

# loadtxt
import numpy as np

# csv 名逗號分隔值文件
filename = './presidential_polls.csv'

# 經過loadtxt()讀取本地csv文件 
data_array = np.loadtxt(filename,      # 文件名
                        delimiter=',', # 分隔符
                        dtype=str,     # 數據類型,數據是Unicode字符串
                        usecols=(0,2,3)) # 指定讀取的列號

# 打印ndarray數據,保留第一行
print(data_array, data_array.shape)
複製代碼

運行結果:

[["b'cycle'" "b'type'" "b'matchup'"]
 ["b'2016'" 'b\'"polls-plus"\'' 'b\'"Clinton vs. Trump vs. Johnson"\'']
 ["b'2016'" 'b\'"polls-plus"\'' 'b\'"Clinton vs. Trump vs. Johnson"\'']
 ..., 
 ["b'2016'" 'b\'"polls-only"\'' 'b\'"Clinton vs. Trump vs. Johnson"\'']
 ["b'2016'" 'b\'"polls-only"\'' 'b\'"Clinton vs. Trump vs. Johnson"\'']
 ["b'2016'" 'b\'"polls-only"\'' 'b\'"Clinton vs. Trump vs. Johnson"\'']] (10237, 3)
複製代碼

#示例代碼2:

import numpy as np
# 讀取列名,即第一行數據
with open(filename, 'r') as f:
    col_names_str = f.readline()[:-1] # [:-1]表示不讀取末尾的換行符'\n'

# 將字符串拆分,並組成列表
col_name_lst = col_names_str.split(',')

# 使用的列名:結束時間,克林頓原始票數,川普原始票數,克林頓調整後票數,川普調整後票數
use_col_name_lst = ['enddate', 'rawpoll_clinton', 'rawpoll_trump','adjpoll_clinton', 'adjpoll_trump']

# 獲取相應列名的索引號
use_col_index_lst = [col_name_lst.index(use_col_name) for use_col_name in use_col_name_lst]

# 經過genfromtxt()讀取本地csv文件,
data_array = np.genfromtxt(filename,      # 文件名
                        delimiter=',', # 分隔符
                        #skiprows=1, # 跳過第一行,即跳過列名
                        dtype=str,     # 數據類型,數據再也不是Unicode字符串
                        usecols=use_col_index_lst)# 指定讀取的列索引號


# genfromtxt() 不能經過 skiprows 跳過第一行的
# ['enddate' 'rawpoll_clinton' 'rawpoll_trump' 'adjpoll_clinton' 'adjpoll_trump']

# 去掉第一行
data_array = data_array[1:]

# 打印ndarray數據
print(data_array[1:], data_array.shape)
複製代碼

運行結果:

[['10/30/2016' '45' '46' '43.29659' '44.72984']
 ['10/30/2016' '48' '42' '46.29779' '40.72604']
 ['10/24/2016' '48' '45' '46.35931' '45.30585']
 ..., 
 ['9/22/2016' '46.54' '40.04' '45.9713' '39.97518']
 ['6/21/2016' '43' '43' '45.2939' '46.66175']
 ['8/18/2016' '32.54' '43.61' '31.62721' '44.65947']] (10236, 5)

複製代碼
相關文章
相關標籤/搜索