3 數據分析之Numpy模塊(2)

數組函數

通用元素級數組函數通用函數(即ufunc)是一種對ndarray中的數據執行元素級的運算。咱們能夠將其看作是簡單的函數(接收一個或多個參數,返回一個或者多個返回值).html

經常使用一元ufunc:python

 

函數 說明
abs 計算整數、浮點數的絕對值。
aqrt 計算各元素的平方根。至關於arr ** 0.5
square 計算各元素的平方。至關於arr ** 2
sign 計算各元素的正負號,1(正數)、0(零)、-1(負數)
ceil 計算各元素的celling值,即大於該值的最小整數。
floor 計算各元素的floor值,即小於等於該值的最大整數。
rint 將各元素值四捨五入到最近的整數,保留dtype
modf 將數組的小數和整數部分以兩個獨立數組的形式返回
isnan 返回一個表示「那些是NaN(這不是一個數字)」的布爾類型數組.

經常使用二元ufunc

函數 說明
add 將數組中對應的元素相加.
subtract 從第一個數組中減去第二個數組中的元素.
multiply 數組元素相乘
divide、floor_divide 除法、向下整除法(丟棄餘數)
power 對第一個數組中的元素A,根據第二數組中的相應元素B,計算A的B次方。
maximum、fmax 元素級的最大值計算。fmax將忽略NaN
minimum、fmin 元素級的最小值計算。fmin將忽略NaN
mod 元素級的求模計算.
copysign 將第二個數組中的值的符號複製給第一個數組中的值.
greater、greater_equal 執行元素級的運算比較,最終產生布爾類型數組

練習

import numpy as np

arr1 = np.random.randint(1, 10, (4, 5))
arr2 = np.random.randint(-10, -1, (4, 5))
arr1 

  

arr2

把數組2的符號複製給數組1數組

np.copysign(arr1, arr2)

  

arr3 = np.array([1, 2, np.nan, 3])
arr3

  

判斷是否是NANapp

np.isnan(arr3)

  

一元運算符練習

ndarray1 = np.array([3.5, 1.7, 2.2, -7.8, np.nan, 4.6, -3.4])
ndarray1

abs 計算整數、浮點數的絕對值dom

np.abs(ndarray1)

  

aqrt 計算各元素的平方根。至關於arr ** 0.5ide

np.square(ndarray1)

  

sign 計算各元素的正負號,1(正數)、0(零)、-1(負數)函數

np.sign(ndarray1)

  

 

ceil 計算各元素的celling值,即大於該值的最小整數工具

np.floor(ndarray1)

  

rint 將各元素值四捨五入到最近的整數,保留dtype學習

np.rint(ndarray1)

  

isnan 返回一個表示「那些是NaN(這不是一個數字)」的布爾類型數組.spa

np.isnan(ndarray1)

  

二元運算符

ndarray2 = np.random.randint(1, 20, (4, 5))
ndarray3 = np.random.randint(-10, 10, (4, 5))
ndarray3 = np.where(ndarray3 == 0, 1, ndarray3)

 

ndarray2

  

ndarray3

add 將數組中對應的元素相加  

np.add(ndarray2, ndarray3)

  

subtract 從第一個數組中減去第二個數組中的元素.  

np.subtract(ndarray2, ndarray3)

  

maximum、fmax 從兩個數組中取出最大值。fmax將忽略NaN

np.maximum(ndarray2, ndarray3)

  

mod 元素級的求模計算.

np.mod(ndarray2, ndarray3)

  

 

 copysign 將第二個數組中的值的符號複製給第一個數組中的值.

np.copysign(ndarray2, ndarray3)

  

greater、greater_equal 執行元素級的運算比較,最終產生布爾類型數組。

np.greater(ndarray2, ndarray3)

  

 

數組統計函數

能夠經過數組上的一組數學函數對整個數組或某些數據進行統計計算。 基本的數組統計方法:

方法 說明
mean 算數平均數。零長度的數組的mean爲NaN.
sum 全部元素的和.
max、min 全部元素的最大值,全部元素的最小值
std、var 全部元素的標準差,全部元素的方差
argmax、argmin 最大值的下標索引值,最小值的下標索引值
cumsum、cumprod 全部元素的累計和、全部元素的累計積

多維數組默認統計所有維度,axis參數能夠按指定軸心統計,值爲0則按列統計,值爲1則按行統計。

示例代碼:

import numpy as np ndarray1 = np.random.randint(1, 10, (4, 5)) ndarray1 
Out[1]:
array([[6, 2, 8, 5, 9],
       [1, 3, 7, 7, 7],
       [3, 8, 7, 3, 7],
       [4, 7, 5, 7, 3]])
 
1. sum求元素和
In [2]:
# 0-列 1-行
# sum-計算全部元素和 np.sum(ndarray1) 
Out[2]:
109
In [3]:
# sum-計算每一列的元素和
np.sum(ndarray1, axis=0) 
Out[3]:
array([14, 20, 27, 22, 26])
In [4]:
# sum-計算每一行的元素和
np.sum(ndarray1, axis=1) 
Out[4]:
array([30, 25, 28, 26])
 
2. argmax求最大值索引
In [5]:
# argmax-默認狀況下按照一維數組索引
np.argmax(ndarray1) 
Out[5]:
4
In [6]:
# argmax-統計每一列最大
np.argmax(ndarray1, axis=0) 
Out[6]:
array([0, 2, 0, 1, 0])
In [7]:
# argmax-統計每一行最大
np.argmax(ndarray1, axis=1) 
Out[7]:
array([4, 2, 1, 1])
 
3. mean求平均數
In [8]:
# mean-求全部元素的平均值
np.mean(ndarray1) 
Out[8]:
5.4500000000000002
In [9]:
# mean-求每一列元素的平均值
np.mean(ndarray1, axis=0) 
Out[9]:
array([ 3.5 ,  5.  ,  6.75,  5.5 ,  6.5 ])
In [10]:
# mean-求每一行元素的平均值
np.mean(ndarray1, axis=1) 
Out[10]:
array([ 6. ,  5. ,  5.6,  5.2])
 
4. cumsum求元素累計和
In [11]:
# cumsum-前面元素的累計和
np.cumsum(ndarray1) 
Out[11]:
array([  6,   8,  16,  21,  30,  31,  34,  41,  48,  55,  58,  66,  73,
        76,  83,  87,  94,  99, 106, 109])
In [12]:
# cumsum-每一列元素的累計和
np.cumsum(ndarray1, axis=0) 
Out[12]:
array([[ 6,  2,  8,  5,  9],
       [ 7,  5, 15, 12, 16],
       [10, 13, 22, 15, 23],
       [14, 20, 27, 22, 26]])
In [13]:
# cumsum-每一行元素的累計和
np.cumsum(ndarray1, axis=1) 
Out[13]:
array([[ 6,  8, 16, 21, 30],
       [ 1,  4, 11, 18, 25],
       [ 3, 11, 18, 21, 28],
       [ 4, 11, 16, 23, 26]])

 

 練習代碼2

import numpy as np

arr1 = np.random.randint(1, 10, (3, 4))
arr1

  

算數平均數

arr1.mean()

  

 

 axis 軸

  axis=0 求列的平均數

  axis=1 求行的平均數

axis=0 求列的平均數 

 

arr1.mean(axis=0)

  

 axis=1 求行的平均數 

arr1.mean(axis=1)

  

sum函數求和

arr1.sum()

  

求列的和

arr1.sum(axis=0)

  

 求行的和

arr1.sum(axis=1)

  

 累積和 cumsum

每一個元素都是前邊全部的想加

arr1.cumsum()

  

all和any函數

import numpy as np

ndarray1 = np.arange(6).reshape((2, 3))
ndarray2 = np.arange(6).reshape((2, 3))
ndarray3 = np.array([[ 0,  1,  2], [ 8,  9, 10]])

  

if (ndarray1 == ndarray2).all():
    print('相等')
else:
    print('不相等')

  

(ndarray1 == ndarray3).all()

  

if (ndarray1 == ndarray3).any():
    print('兩個數組中有元素相等!')
else:
    print('都不相等!')

  

 添加和刪除函數

方法 描述
delete Return a new array with sub-arrays along an axis deleted.
insert(arr, obj, values[, axis]) Insert values along the given axis.
append(arr, values[, axis]) Append values to the end of an array.
resize(a, new_shape) Return a new array with the specified shape.
concatenate((a1,a2,...), axis=0) Join a sequence of arrays along an existing axis.

reshape:有返回值,即不對原始多維數組進行修改; resize:無返回值,即會對原始多維數組進行修改;

import numpy as np

arr1 = np.random.randint(1, 10, (5, 5))
arr1

  

delete方法刪除一行或者一列元素

# 若是沒有指定行列,默認刪除位置元素(將二維數組當作一維數組來計算位置)

np.delete(arr1, 0)

  

按照行刪除
刪除每一列的第1個位置的元素

np.delete(arr1, 1, axis=0)

  

按照列刪除
刪除每一行的第1個位置的元素

np.delete(arr1, 0, axis=1)

  

. insert插入一行或者一列元素

arr2 = np.random.randint(1, 10, (5, 5))
arr2

  

插入一行元素 

 

np.insert(arr2, 0, [100, 200, 300, 400, 500], axis=0)

  

 

插入一列元素 

np.insert(arr2, 1, [11, 22, 33, 44, 55], axis=1)

  

append追加元素

 把二維數組變成一維數組

np.append(arr2, 100)

  

 

concatenate合併

arr3 = np.random.randint(1, 10, (4, 3))
arr3

  

arr4 = np.random.randint(1, 10, (4, 3))
arr4

  

  默認將第二個數組合併到第一個數組的垂直下面

 

np.concatenate([arr3, arr4])

  

 橫向合併兩個數組

np.concatenate([arr3, arr4], axis=1)

  

 

 惟一化和集合函數

 

Numpy提供了一些針對一維ndarray的基本集合運算。最經常使用的就是np.unique了,它用於找出數組中的惟一值並返回已排序的結果。

方法 說明
unique(x) 計算x中的惟一元素,並返回有序結果.
intersect1d(x, y) 計算x和y中的公共元素,並返回有序結果.
union1d(x, y) 計算x和y的並集,並返回有序結果.
in1d(x, y) 獲得一個表示「x的元素是否包含於y」的布爾型數組.
setdiff1d(x, y) 集合的差,即元素在x中且再也不y中.
import numpy as np

arr1 = np.random.randint(1, 3, 10)
arr1

  

去除重複元素 

np.unique(arr1)

  

 

arr2 = np.arange(10)
arr3 = np.arange(5, 15)
arr2

  

arr3

  

 求兩個一維數組的交集

 

np.intersect1d(arr2, arr3)

  

數組A中的元素是否在數組B中存在 

np.in1d(arr2, arr3)

  

 隨機數生成函數

 numpy.random模塊對Python內置的random進行了補充。咱們使用numpy.random能夠很方便根據須要產生大量樣本值。而python內置的random模塊則一次生成一個樣本值.

函數 說明
permutation 若是給的數字,則生成指定個數隨機數 ,若是是數組,則打亂數組返回.
shuffle 打亂一個序列的原有順序.
randint 從給定的上下限隨機選取整數.

 

import numpy as np

arr1 = np.arange(10)
arr1

  

若是permutation參數是數組,那麼打亂數組元素順序
若是參數是數字,隨機生成指定個數的隨機數
打亂數組以後,返回打亂以後的元素序列副本

打亂數組的順序

np.random.permutation(arr1)

  

生成指定個數的隨機數

np.random.permutation(10)

  

 

  打亂數組自己元素的順序

 對原有的數組進行了修改

np.random.shuffle(arr1)
arr1

  

 

 數組排序函數

import numpy as np

arr1 = np.random.randint(1, 10, (5, 5))
arr1

 

 默認按行排序

arr1.sort()
arr1

  

 

 指定按列排序

arr1.sort(axis=0)
arr1

  

沒有從大到小排序

但能夠這樣

arr1[:, 1][::-1]

  

argsort ()函數的使用,返回的是排序後的下標(不對原數組修改)

arr2 = np.random.randint(10, 100, 5)
arr2

  

 

arr2.argsort()

  

 

arr2[arr2.argsort()]

 

 

 

arr2_index[arr2.argsort()]

  

 

argsort ()函數不對原數組進行修改,只對下標進行排序

 

arr2

仍是原來建立的數據

  

數組文件輸入輸出

 Numpy可以讀寫磁盤上的文本數據和二進制數據。後面的課程咱們會學習pandas中用於表格型數據讀取到內存的工具。

np.save和np.load是讀寫磁盤數組數據的兩個主要函數。默認狀況下,數組是以原始二進制格式保存在擴展名爲.npy的文件中。若是在保存文件時沒有指定擴展名.npy,則該擴展名會被自動加上。

經過np.savez能夠將多個數組保存到同一個文件中,將數組以關鍵字參數的形式傳入便可。

例如: np.savez(‘myarr.npz’, a=arr1, b=arr2) 加載文件的時候,咱們會獲得一個相似字典的對象。

 

將數組寫入到文件中(np.save(文件名,保存的數組))
import numpy as np

arr1 = np.arange(25).reshape((5, 5))
arr1

  

np.save('my_arr1', arr1)

  

 

從文件中讀取數組(np.load('文件名'))
np.load('my_arr1.npy')

  

多個數組的讀寫
arr2 = np.arange(25, 50).reshape((5, 5))
arr2

  

把多個數組寫入文件中(np.savez('文件名', a=數組1, b=數組2))

np.savez('multi_files', a=arr1, b=arr2)

  

從文件中讀取各個數組
np.load('multi_files.npz')['a']

  

 

 

np.load('multi_files.npz')['b']

  

 

 讀寫文本文件

從文件中加載文本是一個很是標準的任務。Python中的文件讀寫函數的格式很容易將新手搞暈,因此咱們使用np.loadtxt或者更加專門化的np.genfromtxt將數據加載到普通的Numpy數組中。 這些函數都有許多選項可供使用:指定各類分隔符、跳過行數等。咱們以一個簡單的逗號分割文件(csv)爲例: 

把數組存入文件中

np.savetxt('文件名', 數組, delimiter='分隔符', fmt='%s') %s是普通字符串
# 以逗號分割的格式爲csv格式
np.savetxt('my_arr_data.txt', arr1, delimiter=',', fmt='%s')

  

 

把數組從文件中讀取 -------》np.genfromtxt('文件名', delimiter=',', skip_header=1, skip_footer=1, dtype=np.str
np.genfromtxt('my_arr_data.txt', delimiter=',', skip_header=1, skip_footer=1, dtype=np.str)

 

以字符串類型讀取,跳過首行和結尾的一行

  

 

 

np.genfromtxt('my_arr_data.txt', delimiter=',', skip_header=1, skip_footer=1)

  

相關文章
相關標籤/搜索