numpy常见问题随记

最近在做ksvd相关的东西,在写代码时使用到了numpy,因为是第一次接触,所以其中遇到了不少的问题,本篇博客便将它们记录下来,供将来的自己复习使用,也希望能帮到其他人。

numpy中向量与矩阵的转换

在我需要计算 c j ∗ x j = r c_{j}*x_{j}=r cjxj=r中的 x j x_{j} xj时,其中 c j c_{j} cj是矩阵 C C C的一列,我就直接使用numpy.linalg.pinv(cj).dot(r)[0]来计算了,然而,却不行,报出了Error:must be an array of at least two dimensions的错误,经过百度,最后发现了问题。
问题在于numpy.linalg的运算都是针对矩阵来的,而不是针对向量来的。我们来看一下cj的维度,输入cj.shape,便可以得到cj的维度,结果是(100,),这代表cj是一个向量,是一个维度为100的列向量,它不是矩阵,无法进行矩阵运算,所以,这里需要将它转换成矩阵,才能进行后续的运算。
这里使用numpy提供的reshape函数来将列向量转换成矩阵,cj = np.reshape(cj,(cj.shape[0],1)),第一个参数是要转换的向量or矩阵,第二个参数是一个元组,代表其要转换的维度,这里cj.shape[0]是取(100,)中的100,(也就是行数,如果是shape[1]就是取列数),经过这行代码,得到cj就是个矩阵了,再看一下它的shape,就是(100,1),之后再来计算 x i x_{i} xi就很顺利,不存在什么问题了。

统计矩阵或向量中的0的数量,统计每个数的数量

由于要使得稀疏码尽量稀疏,我需要统计向量或者矩阵中的0的个数。不过numpy并没有直接统计0的个数,或者有时候我们需要的是非零的个数。这里可以使用np.nonzero(a)来处理。它可以统计矩阵或者向量中的非零数,返回非零个数的索引。比如对于[[01][10]]这样一个矩阵,它会返回(array(0,1),array(1,0))这样的数据,前面一个array是非零数的横坐标,后面一个是非零数的纵坐标,如果只需要获取非零数的个数,那么可以用len(np.nonzero(a)[0])来获取,如果是0的个数,用总个数减去它就好了。
除此之外,可能还需要统计一个列表或一个向量中1有多少个,2有多少个,这种问题,也很好解决,虽然不是用numpy。解决代码如下

    from collections import  Counter
    matrix = np.loadtxt(coef_filename)  # 载入稀疏码矩阵
    indexs = np.nonzero(matrix)[0]  # nonzero 返回两个,一个是行坐标索引,一个是列坐标索引
    # 我们这里需要的是非零的数的行坐标,所以【0】就可以了
    # 统计0-199的个数
    dic_freq = Counter(indexs)  # 直接查询索引就能得到所有的字典向量对应的使用数量

这里,Counter()方法的返回值是类似于一个列表,可以通过dic_freq[i]来获取i对应的个数

载入保存在txt中矩阵

我的项目是关于网络的,所以会存大量的邻接矩阵,如果要获取这些矩阵,就得从txt文件中获取,矩阵在txt文件的格式为每一行即一行,每一列即一列,元素之间通过空格隔开,此时使用matrix = np.loadtxt(coef_filename)便可以从txt直接读取矩阵。
同样的,也可以将矩阵存储到txt文件中,np.savetxt(dic_name, dictionary)

如何将矩阵转换成列向量并复制给新矩阵

这里举个例子,a是34的矩阵,此时需要把a变成首尾相接的列向量,其维度是121的,然后把其值赋给15*12的矩阵b的第二列的前12个元素,此时代码可以这样写:

a = np.array([[1,0,3,0],[2,0,4,0],[3,3,3,0]])
# print(a)
print(a.shape)
print(a)
a = np.reshape(a,(a.shape[0]*a.shape[1],))
print(a.shape)
print(a)
b = np.zeros((15,12))
b[:3*4,1] = a
b

持续更新中···

你可能感兴趣的:(python学习)