文章來源:Python數據分析html
###目錄:python
參考學習資料:git
- Python、NumPy和SciPy介紹:cs231n.github.io/python-nump…
- NumPy和SciPy快速入門:docs.scipy.org/doc/numpy-d…
- Python的數據分析: numpy和pandas入門:mp.weixin.qq.com/s/2GxvBC5WW…
#1.ndarray的建立與數據類型 ##1.Numpy(Numerical Python) **Numpy:**提供了一個在Python中作科學計算的基礎庫,重在數值計算,主要用於多維數組(矩陣)處理的庫。用來存儲和處理大型矩陣,比Python自身的嵌套列表結構要高效的多。自己是由C語言開發,是個很基礎的擴展,Python其他的科學計算擴展大部分都是以此爲基礎。github
高性能科學計算和數據分析的基礎包編程
ndarray,多維數組(矩陣),具備矢量運算能力,快速、節省空間數組
矩陣運算,無需循環,可完成相似Matlab中的矢量運算bash
線性代數、隨機數生成dom
import numpy as np
ide
##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年美國總統大選民意調查數據統計
該數據集包含了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)
複製代碼