Reputation: 215
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]))
LAST line is giving me the error. ( output operand requires a reduction, but reduction is not enabled) How do i fix it? I'm new to python and please let me know if there is easier way to do this
Thanks
Upvotes: 3
Views: 4766
Reputation: 19760
The error you're seeing is because of a mismatch in the dimensions of what you have created, but your code is also quite inefficient with all the looping and not making use of Numpy's automatic broadcasting optimally. I've rewritten the code to do what it seems you want:
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])
Upvotes: 1