首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python代码-带有numpy的SVD

Python代码-带有numpy的SVD
EN

Stack Overflow用户
提问于 2017-11-28 23:57:01
回答 2查看 3K关注 0票数 1

我想在Python的代码方面得到一些帮助。我是Python的新手。

在高级时,我从命令行读取一个(.png)文件,放入原始数组,计算svd,在命令行的基础上找到高等级的svd,与原始数组相乘,然后将文件和数组输出。

我的问题是:生成的文件被扭曲了,看起来不像我想要生成的真实图片。

我的问题是:我已经把我正在使用的代码片段放好了,你能指出我做的不对吗?

代码语言:javascript
复制
import sys
import os
import numpy
import numpy.linalg
import scipy.misc

def getOutputPngName(path, rank):
    filename, ext = os.path.splitext(path)
    return filename + '.' + str(rank) + '.png'

def getOutputNpyName(path, rank):
    filename, ext = os.path.splitext(path)
    return filename + '.' + str(rank) + '.npy'

if len(sys.argv) < 3:
    sys.exit('usage: task1.py <PNG inputFile> <rank>')

    inputfile = sys.argv[1]
    rank = int(sys.argv[2])
    outputpng = getOutputPngName(inputfile, rank)
    outputnpy = getOutputNpyName(inputfile, rank)

# Import pic.png into array im as command parameter
img = scipy.misc.imread(inputfile)

# Perform SVD on im and obtain individual matrices
P, D, Q = numpy.linalg.svd(img, full_matrices=False)

# Compute overall SVD matrix based on individual matrices
svd_decomp = numpy.dot(numpy.dot(P, numpy.diag(D)), Q)

# Keep Top entries in svd_decomp
initial = svd_decomp.argsort()
temp = numpy.array(initial)
svd_final = numpy.argpartition(temp,-rank)[-rank:]

# Multiply to obtain the best rank-k approximation of the original array 
img = numpy.transpose(img)
final = (numpy.dot(svd_final,img))

#Saving the approximated array as a binary array file(1) and as a PNG file(2)
numpy.save(outputnpy, final)
scipy.misc.imsave(outputpng, final)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-29 00:36:38

最大的问题是svd_decomp.argsort()。argsort(),没有任何参数,会使整个矩阵变得平坦,并像这样排序,这不是您想要做的事情。

实际上,您不需要进行任何排序,因为linalg的svd()函数可以为您完成排序。见文档

每个矩阵的奇异值,按降序排序。

所以你只需做以下几件事

代码语言:javascript
复制
import sys
import os
import numpy
import numpy.linalg
import scipy.misc

def getOutputPngName(path, rank):
    filename, ext = os.path.splitext(path)
    return filename + '.' + str(rank) + '.png'

def getOutputNpyName(path, rank):
    filename, ext = os.path.splitext(path)
    return filename + '.' + str(rank) + '.npy'

if len(sys.argv) < 3:
    sys.exit('usage: task1.py <PNG inputFile> <rank>')

inputfile = sys.argv[1]
rank = int(sys.argv[2])
outputpng = getOutputPngName(inputfile, rank)
outputnpy = getOutputNpyName(inputfile, rank)

# Import pic.png into array im as command parameter
img = scipy.misc.imread(inputfile)

# Perform SVD on im and obtain individual matrices
P, D, Q = numpy.linalg.svd(img, full_matrices=True)

# Select top "rank" singular values
svd_decomp = numpy.matrix(P[:, :rank]) * numpy.diag(D[:rank]) * numpy.matrix(Q[:rank, :])

# Save the output
numpy.save(outputnpy, svd_decomp)
scipy.misc.imsave(outputpng, svd_decomp)

请注意,我们所做的只是选择“秩”奇异值,不需要排序。

示例输出:

基本图像:

等级=1

职级= 10

票数 3
EN

Stack Overflow用户

发布于 2017-12-04 20:56:53

不需要分类。只需计算你的矩阵超过秩。

代码语言:javascript
复制
svd_decomp = np.zeros((len(P), len(Q)))
for i in range(rank):
    svd_decomp += D[i] * np.outer(P.T[i], Q[i])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47542927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档