Python中的數組和list


Python的X[y==1, 0]

最近研究邏輯回歸,Iris花的經典示例,代碼就不全粘貼了,具體代碼參看“Iris花邏輯回歸與實現

1 plt.plot(X[y==0, 0], X[y==0,1], "bs")
2 plt.plot(X[y==1, 0], X[y==1, 1], "g^")

X[y==0, 0]中的y==0是個什么東東,為什么可以占據X的第一個位置?

首先我們看一下X是個什么?

1 from sklearn import datasets
2 iris = datasets.load_iris()
3 
4 X = iris["data"][:, (2, 3)] # petal length, petal width
5 y = (iris["target"] == 2).astype(np.int)
6 print(X)

 

 

Output:

[[1.4 0.2]
 [1.4 0.2]
...
[5.1 1.8]]
  X是一個數組,數組的元素是一個二元組。在解釋X[y==0, 0]之前,首先要明白X[:,:]左面:代表的是行范圍,右邊“:”代表的是列范圍,如果是冒號則代表全部,否則就像代碼中第四行那樣,指定一個范圍;那么無論是“:”,還是指定一個范圍(類似於(2,3)),其實本質都是會被翻譯成一個true/false的一維一元數組,每個元素都是代表數組對應位置的元素是否要出現。
  比如,y==0,print之后其實是[True True False ...],那么X[y==0, 0],就X的前三個元素而言,分別代表返回(包含),返回(包含),不返回(不包含);與之類似對於“iris["data"][:, (2, 3)]”這個寫法,左邊的那個":"代表的行是[True,True, ... ,True],全是true;
  那么X[y==0, 0]中,第二個0代表什么意思呢?y==1解決了行中那些返回(那些為true的返回),右邊的那個數字代表就是返回那一列,0,代表返回的是第一列,就是上面那個1,4,1.4...5.1;與之類似對於“iris["data"][:, (2, 3)]”這個寫法,代表列是要返回第三列和第四列。
  這里看到在python里面行列的處理模式是不一樣的,行的取舍是通過一個True/ False數組來實現的,列的取舍確實通過指定了那一列;這個其實從矩陣的角度能夠更好的理解。
 
concatenate
 
1 X_outliers=np.array([[3.4, 1.3], [3.2, 0.8]])
2 y_outliers=np.array([0, 0])
3 
4 Xo1=np.concatenate([X, X_outliers[:1]], axis=0)
5 yo1=np.concatenate([y, y_outliers[:1]], axis=0)
6 Xo2=np.concatenate([X, X_outliers[1:]], axis=0)
7 yo2=np.concatenate([y, y_outliers[1:]], axis=0)

 numpy里面的concatenate的涵義是合並矩陣;axis=0代表是添加一行,axis=1則代表添加一列。以此為例:

pprint(X)顯示為:

u'X:'
array([[1.4, 0.2],
[1.4, 0.2],
...

[5.1, 1.8]])

pprint(Xo1)顯示為:

u'Xo1:' 
array([[1.4, 0.2],
[1.4, 0.2],
...

[5.1, 1.8],

[3.4, 1.3]])

這其實就是行添加了一行。

原生數組和reshape之后數組

X_test = np.linspace(1,5,5)
pprint (X_test)
X_tmp = X_test.reshape(-1, 1)
pprint(X_tmp)

輸出:

array([1., 2., 3., 4., 5.])
array([[1.], [2.], [3.], [4.], [5.]])

 python數組常見操作:

Python原生是沒有數組的,[]這種類型在python里面叫List;二維數組可以通過lsti[i][i]來進行索引(array是通過[i, j]來進行索引),支持通過":"來進行范圍索引,但是像前面描述的,只是支持一個維度的索引,例如[:5][1:](對於array而言可以通過[:,:]來進行索引)。
如果是數組的話,還是使用numpy里面的array;
numpy里面提供的是array以及可以通過[x1:x2,y1:y2]模式來索引矩陣形式;同時可以通過array.shape方式來獲取矩陣的行數/列數;同時可以通過reshape來進行行列重置;可以通過.T來進行“轉置”。
matrix是numpy的array的一個子集,同樣支持“:”模式的索引,以及shape[i]獲取行、列的數量;但是只支持矩陣形式:二維數組形式。
matrix和numpy的乘法(*)模式不同,matrix是乘數的行*被乘數的列這種模式;array則是同位數的相乘。
 
互轉:
list轉array:np.array(list)
list轉matrix:np.mat(list)
array轉list:data.toList()
array和matrix互轉:np.asmatrix, np.asarray
 
array想要采用matrix的乘法:np.dot(array1, array2)
matrix想要同位數的乘法:np.multiply(mat1, mat2)
 
成員
# 屬性
ndarray.shape: 多維陣列的大小(形狀)
ndarray.ndim: 多維陣列的維度
ndarray.itemsize: 陣列當中元素的大小(佔幾個 byte)
ndarray.nbytes: 整個陣列所有元素的大小總計
ndarray.T: 轉置矩陣,只能在維度 <= 2 的時候使用,與 self.transpose() 效果相同
ndarray.flat: 把陣列扁平化輸出
 
# 格式轉換
ndarray.item: 類似 List 的 Index,把 Array 扁平化取得某 Index 的 value
ndarray.tolist: 把 NumPy.ndarray 輸出成 Python 原生 List 型態
ndarray.itemset: 把 ndarray 中的某個值(純量)改掉
 
# 維度操作
ndarray.reshape(shape): 把同樣的資料以不同的 shape 輸出(array 的 total size 要相同)
ndarray.resize(shape): 重新定義陣列的大小
ndarray.flatten(): 把多維陣列收合成一維陣列(扁平化&Copy)
ndarray.ravel(): 回傳扁平化的陣列(無 Copy)
 
# 項目選擇與操作
ndarray.take(indices): 根據輸入索引值來得到指定陣列
ndarray.put(indices, values): 根據索引值改變陣列 value
ndarray.repeat(times): 重複陣列的值(類似擴張)
ndarray.sort(): 把陣列當中的元素排序
ndarray.sum(): 加總多維陣列(可指定加總的維度根據)
---------------------
參考
 
 
 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM