kiki
kiki

Reputation: 215

output operand requires a reduction, but reduction is not enabled 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]))

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

Answers (1)

chthonicdaemon
chthonicdaemon

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

Related Questions