output operand requires a reduction, but reduction is not enabled Python
Question: 
    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


Answer: 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])
    

