ndarry基本概念數組
ndarray是numpy庫中的一種數據類型,ndarray 對象是用於存放同類型元素的多維數組,就跟pytorch中的張量tensor相似。app
多維ndarray中,每一維都叫一個軸axis。不少對於ndarray對象的運算都是基於axis進行,好比sum、mean等都會有一個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]])
多維數組的迭代:可使用ndarray的flat屬性迭代數組中每個元素,
>>> 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.arange,numpy 包中的使用 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>
ndarry與list互轉
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]])
方法2和3時間性能比較
對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