Python 學習 第十一篇:numpy

numpy是Python中的基礎模塊,類型ndarray定義了一個具備矢量算術運算的多維數組,無需編寫循環,就能對整個數組進行批量運算。一般狀況下,導入numpy,設置別名爲np。html

import numpy as np 

一,建立多維數組

ndarray是N-Dimension-Array的簡稱,該對象是一個快速而靈活的大數據集容器,該容器中存儲的元素的數據類型都是相同的。算法

建立矩陣的方法有array()、arange()、ones函數和zeros函數,array()是一個函數,用於建立ndarray類型的對象。數組

1,使用array()函數建立數組dom

使用array()函數建立數組,可使用type()函數查看對象的類型:函數

a = np.array([1,2,3,4,5])
a2 = np.array([[1,2,3,4,5],[6,7,8,9,10]])

經過array()函數,使用列表建立的是一維數組,使用嵌套的列表建立的是多維數組。學習

2,使用arange()函數建立矩陣大數據

經過arange()函數建立矩陣,arange相似於Python的內置函數range,但返回的是一個ndarray,而不是列表。spa

函數的參數分別是:start、end和step,code

a = np.arange(10) #default start=0, end=10(exclude 10),step=1
# [0 1 2 3 4 5 6 7 8 9]
a1 = np.arange(5,10) # start=5, end=10(exclude=10),step=1
# [5 6 7 8 9]
a2 = np.arange(5,20,2) # start=5, end=20(exclude 20),step=2
#[ 5  7  9 11 13 15 17 19]

3,使用ones(),zeros()和eye()函數建立數組orm

使用ones()建立元素都爲1的數組,使用zeros()函數建立元素都是0的數組,參數是表示數組形狀shape的元組,表示的是數組各個維度的元素數量。最簡單的二維數組的shape元組是(row_num, column_num) ,它表示數組的行數量和列數量。

>>> a=np.ones(3);
array([ 1.,  1.,  1.])
>>> b=np.ones((3,2));
array([[ 1.,  1.],
       [ 1.,  1.],
       [ 1.,  1.]])

>>> c=np.zeros(3)
array([ 0.,  0.,  0.])
>>> d=np.zeros((2,3));   
array([[ 0.,  0.,  0.],
       [ 0.,  0.,  0.]])

eye()建立一個正方形的NxN的單位矩陣,對角線的元素值是1,其他元素值是0

二,數組的屬性

數組對象的屬性主要有:

  • dtype:描述數組元素的類型
  • shape:以tuple表示的數組形狀
  • ndim:數組的維度
  • size:數組中元素的個數

1,dtype對象

dtype是一個特殊的對象,它表示數組元素的類型。

2,shape對象

以元組形式表示一個數組的維度

3,ndim對象

數組各個維度的元素數量

三,索引和切片

ndarray對象的元素能夠經過索引或切片來訪問和修改,索引基於0。

1,數組的索引

一維數組很簡單,從表面上看,一維數組的索引跟Python列表的功能差很少。

arr = np.arange(10)

arr[index]
arr[start:end]
arr[start:end:step]

在一個二維數組中,各索引位置上的元素再也不是標量,而是一維數組。

arr2d=np.array([[1,2,3],[4,5,6],[7,8,9]])

>>> arr2d[2]
# array([7,8,9])
>>> arr2d[0][2]
#3
>>> arr2d[0,2]
#3

對於更高維度的數組,一箇中括號表示一個維度,索引的使用依此類推。

2,數組的切片

數組切片是原始數組的視圖,修改切片中的原始,會直接修改原始數據。數組的切片是Python基本切片的概念從一維到N維的擴展,經過中括號,start,stop和step參數提供給內置函數的slice函數來構造一個Python slice對象,此slice對象被傳遞給數組來提取數組的一部分。

獲取切片的格式是[start:end:step],若是省略start,使用start的默認值0;若是省略end,那麼end的默認值是:維度長度-1;若是省略step,使用step的默認值1。一般狀況下,數組的切片是[start:end],這就意味着使用step的默認值1。

對於一維數組,數組切片上的任何修改都會直接修改原始數組:

arr = np.arange(10)
arr_slice=arr[5:8]
arr_slice[1]=111
#arr=array([0,1,2,3,4,5,111,7,8,9])

arr_slice[:]=222
#arr=array([0,1,2,3,4,222,222,222,8,9])

對於二維數組,一箇中括號表示一個維度,依此類推。

四,數組的操做

numpy模塊內置的函數可以對數組進行復雜而高效的操做。

1,排序sort

sort(axis,kind)函數用於對數組進行排序,axis指定排序的軸;kind指定排序算法,默認的排序算法是快速排序,np.sort()返回的是數組的已排序的副本,而就是排序則會修改數組自己。

arr.sort()
arr_sort=np.sort(arr)

2,argsort()函數

argsort()函數返回的是按照數組值從小到大的索引值,即返回的是索引值,索引值是按照元素值從小到大獲得的。

x=np.array([1,4,3,-1,6,9])
y=np.argsort(x)
#output
array([3, 0, 2, 1, 4, 5], dtype=int64)

元素-1的值是最小的,其索引是3,所以,argsort()的返回列表中是第一個item。

argsort()函數是將x中的元素從小到大排列提取其對應的index(索引),而後輸出到y,按照降序排序:

y=np.argsort(-x)

按照升序排序:

y=np.argsort(x)

3,vectorize 向量化

numpy.vectorize()函數定義一個向量化函數,它以序列或numpy數組做爲輸入,對numpy數組作向量化操做。函數輸出的數據類型是由otypes參數肯定的,若是otypes=None,那麼輸出的數據類型是經過使用輸入的第一個元素調用函數來肯定的,該函數返回一個函數對象。

numpy.vectorize(pyfunc, otypes=None, doc=None, excluded=None, cache=False, signature=None)

參數註釋:

  • pyfunc:函數對象
  • otype:輸出數據的類型(putput data type)

使用vectorize()定義一個向量化函數,對數組作向量化操做:

def myfunc(a, b):
    return a-b if a>b else a+b

vfunc = np.vectorize(myfunc)
vfunc([1, 2, 3, 4], 2)
#output array([3, 4, 1, 2])

4,tolost

tolost()函數用於把一個矩陣轉化爲list列表

5,reshap

reshap(array,newshape) :返回一個給定shape的數組的副本,例如,下面的代碼把一個一維數組轉換爲4行2列的二位數組:

a=np.arange(8)
np.reshape(a,(4,2))

6,flatten

返回展平數組,原數組不改變

a=np.arange(8)
b=np.reshape(a,(4,2))
b.flatten()

五,隨機數生成

numpy.random模塊是對Python內置的random的升級,增長了一些用於搞笑生成多種機率分佈的樣本值的函數。

經常使用的numpy.random模塊的函數:

  • seed:肯定隨機數生成器的種子
  • permutation:返回一個序列的隨機排列
  • shuffle:對一個序列就地進行隨機排列
  • rand:產生均勻分佈的樣本值
  • randint:從給定的上下限範圍內隨機選取正數
  • randn:產生標準正態分佈
  • binomial:產生二項分佈的樣本值
  • normal:產生高斯正態分佈的樣本值
  • beta:產生Beta分佈的樣本值
  • chisquare:產生卡方分佈的樣本值
  • gamma:產生伽馬分佈的樣本值
  • uniform:產生在[0,1]範圍中均勻分佈的樣本值

例如,使用normal獲得一個標準正態分佈的4x4樣本數組:

samples=np.random.normal(size=(4,4))

 

 

參考文檔:

Python NumPy學習總結

相關文章
相關標籤/搜索