Python的X[y==1, 0]
最近研究逻辑回归,Iris花的经典示例,代码就不全粘贴了,具体代码参看“Iris花逻辑回归与实现”
plt.plot(X[y==0, 0], X[y==0,1], "bs")
plt.plot(X[y==1, 0], X[y==1, 1], "g^")
X[y==0, 0]中的y==0是个什么东东,为什么可以占据X的第一个位置?
首先我们看一下X是个什么?
from sklearn import datasets
iris = datasets.load_iris() X = iris["data"][:, (2, 3)] # petal length, petal width
y = (iris["target"] == 2).astype(np.int)
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
X_outliers=np.array([[3.4, 1.3], [3.2, 0.8]])
y_outliers=np.array([0, 0]) Xo1=np.concatenate([X, X_outliers[:1]], axis=0)
yo1=np.concatenate([y, y_outliers[:1]], axis=0)
Xo2=np.concatenate([X, X_outliers[1:]], axis=0)
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(): 加總多維陣列(可指定加總的維度根據)
---------------------
参考