2015-01-20 18 views
0

У меня возникла проблема с вызовом функции дважды. Если я прокомментирую мои последние 3 строки и сохраняю команду show(), то у меня не будет никакой ошибки, и что-то произойдет, поскольку они предполагают .. но если я dnot комментарий не как я пытаюсь вызвать последнюю функцию снова показывает эту ошибкуЗачем вызывать вызов дважды, показывая ошибку

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' 

здесь функция

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() 
+1

Прочитать сообщение об ошибке, для списков нет оператора '-'. Ваш синтаксис 'y [2:]', например, сделает фрагмент **, который является списком ** вы не можете вычитать списки – CoryKramer

+1

Не совсем понятно, что вы пытаетесь сделать. Попробуйте сделать эти списки «numpy» массивами, например. 'x = np.array (x)'. Для них можно использовать '-'. –

+1

Я думаю, что комментарий @tobias_k поражает гвоздь на голове.Видимо, использование импорта pylab и numpy, OP используется для работы с массивами, а пулы Python и массивы numpy запутаны. Дополнительное примечание: 'from pylab import *' будет включать все от numpy; насколько я знаю, 'from pylab import *' не подходит для 'from pyplot import *; из numpy import * '. Также рекомендуется * не использовать этот вид импорта. 'from matplotlib import pyplot as plt' часто лучше и понятнее. – Evert

ответ

0

Как объяснены в других ответах, вы не можете вычесть регулярные списки Python. Так почему он работает в первый раз и не работает второй? Давайте посмотрим на код.

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) 
... 

При первом вызова c_d параметры x и y кажется numpy массив (по крайней мере, t и phase являются результатом numpy вызовов функциев), а также для тех, - является юридическим действием. Но внутри c_d, вы создаете и, наконец, вернуть регулярный список Python, dy, поэтому, когда вы затем вызвать c_dснова с результатом первого вызова, как y, эта часть y[2:]-y[0:-2] потерпит неудачу, поскольку y сейчас обычный список ,

Убедитесь, что dy является numpy массив, тоже, т.е. dy = np.array([0.0] *order) или просто dy = np.zeros(order), то он должен работать.

+1

отличная помощь от вас @tobias. Я случайно сделал то же самое (не имея в виду разницу в массе, которую он сделает). Но спасибо, что объяснил это чувак. Он отлично работал. Thrks для времени и усилий ура :) – Gaurav16

+0

Эта помощь действительно сработала. – Gaurav16

1

проблема очень четко поясняется в сообщении об ошибке: Оператор '-' не применяется для списка типов.

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

y [2:] разрезает список и возвращает список. y [0: -2] разрезает список и возвращает список. Итак, у вас есть 2 списка.

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

И список - список не определен (нет синтаксиса: 'ListObject' - 'ListObject').

НО: оператор + определен для списков (например):

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

n = l + m 

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

Посмотрите здесь для этих различных видов возможных операторов: https://docs.python.org/2/library/stdtypes.html

+0

Точнее, вы можете использовать отрицательную индексацию в списках, но ваша проблема заключается в том, что вы пытаетесь вычесть один список из другого. –

+1

@ RyanO'Donnell: Да, я не говорил о нарезке, я отредактирую свой вопрос, чтобы сделать его более ясным. – ProgrammingIsAwsome

0

Как заявил Cyber ​​и ProgrammingIsAwsome погрешность находится на линии

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

где вы на самом деле пытаетесь вычесть списки.

Вы можете написать явно:

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

Я не предпочитаю цикл. Объяснение Bt tobias_k сработало для меня. У меня есть концептуальная проблема, когда python создает список и генерирует массив. – Gaurav16

+0

@AwanishAwanish Python, но сам использует списки только. 'numpy' позволяет использовать массивы. –

+0

Спасибо любому человеку. – Gaurav16

Смежные вопросы