numpy 常用api(一)
numpy 常用api(二)
一个函数提供 random_state 的关键字参数(keyword parameter):是为了结果的可再现性(reoccurrence)或叫可重复性。
接口为:
numpy.bincount(x, weights=None, minlength=None)
尤其适用于计算数据集的标签列(y_train)的分布(distribution),也即获得 class distribution :
>>> np.bincount(y_train.astype(np.int32))
>>> np.bincount(np.array([0, 1, 1, 3, 2, 1, 7]))
array([1, 3, 1, 1, 0, 0, 0, 1], dtype=int32)
# 分别统计0-7分别出现的次数
If weights is specified the input array is weighted by it, i.e. if a value n is found at position i, out[n] += weight[i] instead of out[n] += 1.
>>> w = np.array([0.3, 0.5, 0.2, 0.7, 1., -0.6]) # weights
>>> x = np.array([0, 1, 1, 3, 2, 2])
>>> np.bincount(x, w)
array([ 0.3, 0.7, 0.4, 0.7])
np.bincount() 从零开始计数;
>>> np.bincount([3, 4, 4, 3, 3, 5])
array([0, 0, 0, 3, 2, 1], dtype=int32)
# 分别表示0出现的次数,
# 1出现的次数,
# 2出现的次数,
# 。。。
>>> np.hstack([np.array([1, 2, 3]), np.array([4, 5, 6])])
array([1, 2, 3, 4, 5, 6])
>>> np.column_stack([np.array([1, 2, 3]), np.array([4, 5, 6])])
array([[1, 4], [2, 5], [3, 6]])
当然对等地,也存在,np.vstack, np.row_stack
>>> np.vstack([np.array([1, 2, 3]), np.array([4, 5, 6])])
array([[1, 2, 3], [4, 5, 6]])
>>> np.row_stack([np.array([1, 2, 3]), np.array([4, 5, 6])])
array([[1, 2, 3], [4, 5, 6]])
# 两者近乎等效
首先一点,不管二者处理的是不是对称阵,两者处理的首先是方阵(square array)。
两者均用于矩阵特征分解,np.linalg.eigh()适用于对称矩阵,可见矩阵分析中针对对称矩阵的特征值分解有一套特殊的不同于一般矩阵的理论。
def main():
X = np.random.randn(3, 3)
X = X.triu()
X += (X.T-np.diag(X.diagonal()))
# 构造对称矩阵 X
Lambda1, Q1 = np.linalg.eig(X)
Lambda2, Q2 = np.linalg.eigh(X)
print(Lambda1)
# [ 1.53176315 -0.35907022 -1.8924684 ]
# 排序不太严格
print(Lambda2)
# [-1.8924684 -0.35907022 1.53176315]
# 严格的升序
if __name__ == '__main__':
main()
np.average(X, axis=0, weights=w) == w.dot(X)
等式左部表示加权平均,sum(w)==1时才有意义,也即等式的左部比等式的右部多了一层加权平均的意义,内积代表着实现该意义的动作。
X = np.array([[.9, .1], [.8, .2], [.4, .6]])
w = np.array([.2, .2, .6])
print(w.dot(X))
print(np.average(X, axis=0, weights=w))
在一些情况下只能使用np.average()而无法使用简单的矩阵乘法操作:
比如:
P = np.asarray([c.predict_proba(X) for c in clfs])
# 此时P是一个三维矩阵
# (# of clfs) * (# of samples) * (# of classes)
np.average(P, axis=0, weights=w)
# 此时的shape为 ((# of samples) * (# of classes))
# 仍然维持行和为1
也有一些情况下只能使用 np.average 而无法使用dot(矩阵乘法,matrix multiplication)运算:
def predict_proba(self, X):
probas = np.asarray([clf.predict_proba(X) for clf in self.classifiers_])
# return self.weights.dot(probas)
# 此时self.weights有未赋值的风险
# None类型肯定是不支持dot函数的
return np.average(probas, axis=0, weights=self.weights)
# np.average的功能便是,如果weights参数为None
# 就执行正常的求平均操作
这是一个神奇的强大的函数,在指定轴上,按指定的函数进行操作;
>>> b = np.array([[1,2,3], [4,5,6], [7,8,9]])
>>> np.apply_along_axis(np.diff,0,b)
# 在列方向进行差分的动作
array([[3, 3, 3], [3, 3, 3]])
>>> np.apply_along_axis(np.diff,1,b)
array([[1, 1], [1, 1], [1, 1]])
>>> b = np.array([[8,1,7], [4,3,9], [5,2,6]])
>>> np.apply_along_axis(sorted, 1, b)
array([[1, 7, 8], [3, 4, 9], [2, 5, 6]])
这个函数真正的意义在于什么,除了更精细化,customized的处理行和列外,它对一些不具备axis参数的函数,使其具备逐行或者逐列处理的能力 np.bincount(),而不必逐行逐列地进行遍历。
P = np.asarray([clf.predict(X) for clf in self.classifiers_])
maj_vote = np.apply_along_axis(lambda col: np.argmax(np.bincount(col, weights=self.weights)), axis=0, arr=P)