2013-02-21 2 views
3
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

당신이 그렇게 import 문 (등 NP, scipy #의 토플 리츠 등 NumPy와)을 추가 할 수 있다면 큰 도움이 될 코드를 복사, 붙여 넣기 및 실행 그대로. – YXD

+0

방금 ​​포함되었습니다. 감사합니다 – kiki

+2

오류가 발생하는 행에서 왼쪽은 모양이 (512,)이고 오른쪽이 모양이 (512, 512)입니다. 512x512 2D 배열을 512 길이 1D 배열로 밀어 넣으려고합니다. – DSM

답변

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]) 
관련 문제