输出操作数需要归约,但未启用归约 Python
import numpy as np
from numpy.linalg import solve,norm,cond,inv,pinv
import math
import matplotlib.pyplot as plt
from scipy.linalg import toeplitz
from numpy.random import rand
c = np.zeros(512)
c[0] = 2
c[1] = -1
a = c
A = toeplitz(c,a)
cond_A = cond(A,2)
# creating 10 random vectors 512 x 1
b = rand(10,512)
# making b into unit vector
for i in range (10):
b[i]= b[i]/norm(b[i],2)
# creating 10 random del_b vectors
del_b = [rand(10,512), rand(10,512), rand(10,512), rand(10,512), rand(10,512), rand(10,512), rand(10,512), rand(10,512), rand(10,512), rand(10,512)]
# del_b = 10 sets of 10 vectors (512x1) whose norm is 0.01,0.02 ~0.1
for i in range(10):
for j in range(10):
del_b[i][j] = del_b[i][j]/(norm(del_b[i][j],2)/((float(j+1)/100)))
x_in = [np.zeros(512), np.zeros(512), np.zeros(512), np.zeros(512), np.zeros(512), np.zeros(512), np.zeros(512), np.zeros(512), np.zeros(512), np.zeros(512)]
x2 = np.zeros((10,10,512))
for i in range(10):
x_in[i] = A.transpose()*b[i]
for i in range(10):
for j in range(10):
x2[i][j] = ((A.transpose()*(b[i]+del_b[i][j]))
最后一行代码让我遇到了错误。(输出操作需要进行归约,但归约没有启用) 我该怎么解决这个问题? 我刚开始学Python,如果有更简单的方法,请告诉我。
谢谢!
1 个回答
1
你看到的这个错误是因为你创建的东西的尺寸不匹配。不过,你的代码也有点低效,因为里面有很多循环,而且没有充分利用Numpy的自动广播功能。我已经把代码重写了一下,让它更符合你的需求:
import numpy as np
from numpy.linalg import solve,norm,cond,inv,pinv
import math
import matplotlib.pyplot as plt
from scipy.linalg import toeplitz
from numpy.random import rand
# These should probably get more sensible names
Nvec = 10 # number of vectors in b
Nlevels = 11 # number of perturbation norm levels
Nd = 512 # dimension of the vector space
c = np.zeros(Nd)
c[0] = 2
c[1] = -1
a = c
# NOTE: I'm assuming you want A to be a matrix
A = np.asmatrix(toeplitz(c, a))
cond_A = cond(A,2)
# create Nvec random vectors Nd x 1
# Note: packing the vectors in the columns makes the next step easier
b = rand(Nd, Nvec)
# normalise each column of b to be a unit vector
b /= norm(b, axis=0)
# create Nlevels of Nd x Nvec random del_b vectors
del_b = rand(Nd, Nvec, Nlevels)
# del_b = 10 sets of 10 vectors (512x1) whose norm is 0.01,0.02 ~0.1
targetnorms = np.linspace(0.01, 0.1, Nlevels)
# cause the norms in the Nlevels dimension to be equal to the target norms
del_b /= norm(del_b, axis=0)[None, :, :]/targetnorms[None, None, :]
# Straight linear transformation - make sure you actually want the transpose
x_in = A.T*b
# same linear transformation on perturbed versions of b
x2 = np.zeros((Nd, Nvec, Nlevels))
for i in range(Nlevels):
x2[:, :, i] = A.T*(b + del_b[:, :, i])