numpy(一)ndarry

ndarry基本概念數組

ndarraynumpy庫中的一種數據類型,ndarray 對象是用於存放同類型元素的多維數組,就跟pytorch中的張量tensor相似。app

 

多維ndarray中,每一維都叫一個軸axis。不少對於ndarray對象的運算都是基於axis進行,好比summean等都會有一個axis參數(針對對這個軸axis進行某些運算操做)。dom

 

對於多維數組,由於每個軸都有一個索引,因此這些索引由逗號進行分割,例如:函數

>>> x = np.arange(0, 100, 5).reshape(4, 5)性能

>>> xspa

array([[ 0,  5, 10, 15, 20],.net

       [25, 30, 35, 40, 45],對象

       [50, 55, 60, 65, 70],blog

       [75, 80, 85, 90, 95]])索引

>>> x[1,2]      #第1行,第2列

35

>>> x[1:4, 3]    #第1行到第3行中全部第3列的元素

array([40, 65, 90])

>>> x[:, 4]      #全部行中的全部第4列的元素

array([20, 45, 70, 95])

>>> x[0:3, :]    #第0行到第三行中全部列的元素

array([[ 0,  5, 10, 15, 20],

       [25, 30, 35, 40, 45],

       [50, 55, 60, 65, 70]])

當提供的索引比軸數少時,缺失的索引表示整個切片(只能缺失後邊的軸)當提供的索引爲:時,也表示整個切片可使用...代替幾個連續的:索引

>>> x[1:3]    #缺失第二個軸

array([[25, 30, 35, 40, 45],

       [50, 55, 60, 65, 70]])

>>> x[:, 1:3]      #第一個軸是 :

array([[ 5 10]

       [30 35]

       [55 60]

       [80 85]])

>>> x[..., 0:4]    #...表明了第一個軸的 : 索引

array([[ 0,  5, 10, 15],

       [25, 30, 35, 40],

       [50, 55, 60, 65],

       [75, 80, 85, 90]])

多維數組的迭代:可使用ndarrayflat屬性迭代數組中每個元素

>>> for item in x.flat:

...     print item,

...

0 5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90 95

 

產生ndarray類型的狀況:

np.array()

np.arange(5)使用方法

np.random.randn(5,3)

 

numpy.empty

numpy.zeros

numpy.ones

numpy.asarray

相似 numpy.array,但 numpy.asarray 參數只有三個,比 numpy.array 少兩個。

numpy.asarray(a, dtype = None, order = None)

np.fromstring,從字符串中讀取數據並建立數組

np.fromfunction,由第一個參數做爲計算每一個數組元素的函數(函數對象或者lambda表達式都可),第二個參數爲數組的形狀

 

numpy.frombuffer

numpy.fromiter

numpy.arangenumpy 包中的使用 arange 函數建立數值範圍並返回 ndarray 對象

numpy.linspace,用於建立一個一維數組,數組是一個等差數列構成的,格式以下:

np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)

numpy.logspace與linspace相似,只不過它建立的是一個等比數列,也是一個一維數組

np.zeros_like(a),建立shape相同的多維數組:ones_like、zeros_like、empty_like

 

diag函數返回一個矩陣的對角線元素、或者建立一個對角陣,對角線由參數k控制

diagflat函數以輸入做爲對角線元素,建立一個矩陣,對角線由參數k控制

tri函數生成一個矩陣,在某對角線如下元素全爲1,其他全爲0,對角線由參數k控制

tril函數輸入一個矩陣,返回該矩陣的下三角矩陣,下三角的邊界對角線由參數k控制

triu函數與tril相似,返回的是矩陣的上三角矩陣

vander函數輸入一個一維數組,返回一個範德蒙德矩陣

 

 

花式索引,指的是利用整數數組進行索引。【原來這就是我以前一直找的那個方法!!!用下標array做爲索引!】

 

花式索引根據索引數組的值做爲目標數組的某個軸的下標來取值。對於使用一維整型數組做爲索引,若是目標是一維數組,那麼索引的結果就是對應位置的元素;若是目標是二維數組,那麼就是對應下標的行。

 

花式索引跟切片不同,它老是將數據複製到新數組中。

 

一、傳入順序索引數組

 

實例

import numpy as np

 

x=np.arange(32).reshape((8,4))

print (x[[4,2,1,7]])

 

二、傳入倒序索引數組

 

實例

import numpy as np

 

x=np.arange(32).reshape((8,4))

print (x[[-4,-2,-1,-7]])

輸出結果爲:

 

[[16 17 18 19]

 [24 25 26 27]

 [28 29 30 31]

 [ 4  5  6  7]]

三、傳入多個索引數組(要使用np.ix_)

 

實例

import numpy as np

 

x=np.arange(32).reshape((8,4))

print (x[np.ix_([1,5,7,2],[0,3,1,2])])

輸出結果爲:

 

[[ 4  7  5  6]

 [20 23 21 22]

 [28 31 29 30]

 [ 8 11  9 10]]

 

ndarry經常使用屬性:

size

數組中元素個數

itemsize

數組中單個元素的字節長度

dtype

數組元素的數據類型對象

ndim

數組的維度(改變維度用a.reshape())

shape

數組的形狀

 

ndarray操做的函數:

在numpy中,通常可直接用於ndarray類型數據上的方法也有與之對應的numpy函數可執行相同操做:

 

 

源文檔 <https://www.jianshu.com/p/0c6c14d9e963>

 

ndarrylist互轉

list(arr),轉爲list

np.array(list),轉爲ndarry

 

怎麼拼接兩個ndarry

方法3最適合大規模數據拼接。

方法1.先轉爲list,再用a_list.extend(b_list)拼接。

該方法只適用於簡單的一維數組拼接,轉換很耗時,大量數據拼接不建議。

 

首先將數組轉成列表,而後利用列表的拼接函數append()、extend()等進行拼接處理,最後將列表轉成數組。

 

示例1:

>>> import numpy as np

>>> a=np.array([1,2,5])

>>> b=np.array([10,12,15])

>>> a_list=list(a)

>>> b_list=list(b)

>>> a_list.extend(b_list)

>>> a_list

[1, 2, 5, 10, 12, 15]

>>> a=np.array(a_list)

>>> a

array([ 1,  2,  5, 10, 12, 15])

方法2.numpy提供numpy.append(arr, values, axis=None)函數。

對於參數規定,要麼一個數組和一個數值;要麼兩個數組,不能三個及以上數組直接append拼接。append函數返回的始終是一個一維數組。

 

示例2:

>>> a=np.arange(5)

>>> a

array([0, 1, 2, 3, 4])

>>> np.append(a,10)

array([ 0,  1,  2,  3,  4, 10])

>>> a

array([0, 1, 2, 3, 4])

 

方法3.numpy提供numpy.concatenate((a1,a2,...), axis=0)函數。

可以一次完成多個數組的拼接。其中a1,a2,...是數組類型的參數

 

示例3:

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

>>> b=np.array([11,22,33])

>>> c=np.array([44,55,66])

>>> np.concatenate((a,b,c),axis=0)  # 默認狀況下,axis=0能夠不寫

array([ 1,  2,  3, 11, 22, 33, 44, 55, 66]) #對於一維數組拼接,axis的值不影響最後的結果

 

>>> a=np.array([[1,2,3],[4,5,6]])

>>> b=np.array([[11,21,31],[7,8,9]])

>>> np.concatenate((a,b),axis=0)

array([[ 1,  2,  3],

       [ 4,  5,  6],

       [11, 21, 31],

       [ 7,  8,  9]])

 

>>> np.concatenate((a,b),axis=1)  #axis=1表示對應行的數組進行拼接

array([[ 1,  2,  3, 11, 21, 31],

       [ 4,  5,  6,  7,  8,  9]])

 

方法23時間性能比較

對numpy.append()和numpy.concatenate()兩個函數的運行時間進行比較

 

示例4:

 

>>> from time import clock as now

>>> a=np.arange(9999)

>>> b=np.arange(9999)

>>> time1=now()

>>> c=np.append(a,b)

>>> time2=now()

>>> print time2-time1

28.2316728446

>>> a=np.arange(9999)

>>> b=np.arange(9999)

>>> time1=now()

>>> c=np.concatenate((a,b),axis=0)

>>> time2=now()

>>> print time2-time1

20.3934997107

 

可知,concatenate()效率更高,適合大規模的數據拼接

 

 

參考:https://blog.csdn.net/zyl1042635242/article/details/43162031

相關文章
相關標籤/搜索