gpt4 book ai didi

Python 代码 - SVD 与 numpy

转载 作者:行者123 更新时间:2023-11-30 22:25:23 25 4
gpt4 key购买 nike

我想获得有关 Python 代码的一些帮助。我是 Python 新手。

在高层 - 我从命令行读取一个(.png)文件,放入原始数组,计算 svd,根据命令行找到 svd 的高阶,与原始数组相乘,然后最后放入文件和数组出来。

我的问题:生成的文件失真,看起来不像我想要生成的真实图片。

我的问题:我已经放置了我正在使用的代码片段,您能指出我做错了什么吗?

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)

最佳答案

最大的问题是 svd_decomp.argsort()。不带任何参数的 argsort() 会展平整个矩阵并对其进行排序,这不是您想要做的。

事实上,您不需要进行任何排序,因为 linalg 的 svd() 函数会为您完成此操作。请参阅documentation

The singular values for every matrix, sorted in descending order.

所以你只需要执行以下操作

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)

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

示例输出:

基础图像:

enter image description here

排名=1

enter image description here

排名 = 10

enter image description here

关于Python 代码 - SVD 与 numpy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47542927/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com