2014-02-10 3 views
41
f=np.loadtxt('Single Small Angle 1.txt',unpack=True,skiprows=2) 
g=np.loadtxt('Single Small Angle 5.txt',unpack=True,skiprows=2) 

x = f-g[:,:11944] 
t=range(len(x)) 
m=math.log10(abs(x)) 

np.polyfit(t,m) 

plt.plot(t,abs(x)) 
plt.show() 

Я просто не уверен, как исправить мою проблему. Он продолжает говорить:TypeError: только массивы длиной-1 могут быть преобразованы в скаляры Python при попытке экспоненциально соответствовать данным

m=math.log10(abs(x)) 
TypeError: only length-1 arrays can be converted to Python scalars 
+3

Когда вы загружаете собственный список python, например [1,2,3], в метод numpy, который ожидает массив numpy, вы получите эту ошибку. Этот метод numpy берет ваш собственный список python и пытается его переварить, а путь вглубь он вызывает этот ответ. Более удобным для пользователя сообщение об ошибке было бы: 'TypeError: не кормить собственные списки python в numpy-функции, которые ожидают массивы numpy. Либо преобразуйте ваш список python в массив numpy, либо упакуйте ваши списки python в кортеж. «Python numpy действительно сбросил мяч на него, это сообщение об ошибке ужасно. –

ответ

69

Non-Numpy функции, такие как math.abs() или math.log10() не дружат с Numpy массивами. Просто замените строку поднимая ошибку с:

m = np.log10(np.abs(x)) 

Помимо что np.polyfit() вызов не будет работать, потому что отсутствует параметр (и вы не назначая результат для дальнейшего использования в любом случае).

+0

Отличный ответ. В дополнение к этому, я думаю, что ни одна из математических функций не работает с массивами numpy. Лучше измените их с помощью функций numpy. – endertunc

+0

Спасибо большое! Я столкнулся с аналогичной проблемой с math.power в сочетании с другими функциями numpy. Замена math.power с помощью numpy.power решила проблему. –

47

Вот еще один способ, чтобы воспроизвести эту ошибку в python2.7 с NumPy:

import numpy as np 
a = np.array([1,2,3]) 
b = np.array([4,5,6]) 
c = np.concatenate(a,b) #note the lack of tuple format for a and b 
print(c) 

Метод np.concatenate производит ошибку:

TypeError: only length-1 arrays can be converted to Python scalars 

Если вы читаете документацию вокруг numpy.concatenate, то вы увидите, что он ожидает кортежей объектов numpy array. Таким образом, окружающий переменные с фиксированными скобками это:

import numpy as np 
a = np.array([1,2,3]) 
b = np.array([4,5,6]) 
c = np.concatenate((a,b)) #surround a and b with parens, packaging them as a tuple 
print(c) 

Затем он печатает:

[1 2 3 4 5 6] 

Что здесь происходит?

Эта ошибка является примером реализации пузырьковой реализации, вызванной философией питона на утиной. Это критическая ошибка низкого уровня. Питоны python puke up, когда он получает некоторые неожиданные типы переменных, пытается убежать и что-то делать, получает часть пути, попытки заражения, попытки исправления, терпят неудачу, а затем говорит вам, что «вы можете», t refromulate подпространство реагирует, когда ветер дует с востока во вторник ».

В более разумных языках, таких как C++ или Java, он сказал бы вам: «вы не можете использовать TypeA, где ожидался TypeB». Но Python делает это лучше для солдат, делает что-то неопределенное, терпит неудачу, а затем возвращает вам бесполезную ошибку. Тот факт, что мы должны обсуждать это, является одной из причин, по которым мне не нравится Python, или ее философия утиной печати.

+1

все еще встречается в python 3 и убивает меня таинственно. – Christophe

+0

Попробуйте использовать отладчик pdb, чтобы получить дополнительную информацию об ошибке: https://docs.python.org/3/library/pdb.html –

+1

О, извините, мой пост не ясен. Я имел в виду, что у меня была такая же проблема с конкатенацией, и ваш ответ решил это для меня. Вы упомянули, что это ошибка (функция?) С Python2.7 и numpy, он все еще существует с python3 и numpy :) – Christophe

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

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