Gaurav16
Gaurav16

Reputation: 35

Why does calling this function twice cause an error?

I am having a problem with calling a function twice. If I comment my last 3 lines and keep show(), I don't get any errors and things come as they are suppose to. However, if I don't comment them out calling the last function again gives me this error:

Traceback (most recent call last):
  File "second_1.py", line 29, in <module>
    domega=c_d(len(t),t,z)
  File "second_1.py", line 25, in c_d
    dy[1:-1]=(y[2:]-y[0:-2])/(x[2:]-x[0:-2])
TypeError: unsupported operand type(s) for -: 'list' and 'list'

Here is the function:

import numpy as np
from pylab import *
import time

t_initial=time.time()
clf()
t,hp,hn= np.loadtxt("Richardson.dat", usecols=(0,1,2),comments='#', unpack=True)     # to select just a few columns
print(time.time()-t_initial)  

def phi(y,x):
    return(np.arctan(y/x))

phase=[0.0]*len(t)
phase=phi(hp[0:],hn[0:])
#plot(t,phase)
#show()    

def c_d(order,x,y):
    dy=[0.0]*order
    dy[0]=(y[1]-y[0])/(x[1]-x[0])
    dy[-1]=(y[-1]-y[-2])/(x[-1]-x[-2])
    dy[1:-1]=(y[2:]-y[0:-2])/(x[2:]-x[0:-2])
    return(dy);
    z=c_d(len(t),t,phase);
    plot(t,z)
    print(len(z)-len(t))
    domega=c_d(len(t),t,z)
    plot(t,domega)
    show()

Upvotes: 0

Views: 364

Answers (3)

tobias_k
tobias_k

Reputation: 82899

As explained in the other answers, you can not subtract regular Python lists. So why does it work the first time, and fails the second? Let's take a look at the code.

t, hp, hn = np.loadtxt(...)
...
def c_d(order, x, y):
    dy       = [0.0] * order
    dy[ 0]   = (y[1] -y[0])    / (x[ 1]-x[0])
    dy[-1]   = (y[-1]-y[-2])   / (x[-1]-x[-2])
    dy[1:-1] = (y[2:]-y[0:-2]) / (x[2:]-x[0:-2])
    return dy

z = c_d(len(t), t, phase)
...
domega = c_d(len(t), t, z)
...

When you first call c_d, the parameters x and y seem to be numpy arrays (at least t and phase are results of numpy function calls), and for those, - is a legal operation. But inside c_d, you create and finally return a regular Python list, dy, so when you then call c_d again with the result of the first call as y, this part y[2:]-y[0:-2] will fail, as y now is a regular list.

Make sure your dy is a numpy array, too, i.e. dy = np.array([0.0] *order) or just dy = np.zeros(order), then it should work.

Upvotes: 0

ProgrammingIsAwsome
ProgrammingIsAwsome

Reputation: 1129

The problem is very clearly explained in the error message: The '-' operand is not applicable for the type list.

(y[2:]-y[0:-2])/(x[2:]-x[0:-2])

y[2:] slices a list and returns a list. y[0:-2] slices also a list and returns a list. So there you have 2 lists.

y[2:] (a list)   -(your operator)   y[0:-2] (a list)

And list - list is not defined (there is no syntax for: 'listObject' - 'listObject').

BUT: the + operator is defined for lists (example):

l = ["ja"]
m = ["nein"]

n = l + m

print n
# output: ['ja', 'nein']

Take a look here for these different kind of possible operators: https://docs.python.org/2/library/stdtypes.html

Upvotes: 1

Serge Ballesta
Serge Ballesta

Reputation: 148900

As stated by Cyber and ProgrammingIsAwsome the error is on line

(y[2:]-y[0:-2])/(x[2:]-x[0:-2])

where you actually try to substract lists.

You could write explicitely :

for i in range(1, order - 1):
    dy[i]=(y[i+1]-y[i-1])/(x[i+1]-x[1-1])

Upvotes: 0

Related Questions