it-roy-ru.com

TypeError: только массивы длины 1 могут быть преобразованы в Python скаляры при попытке экспоненциального подбора данных

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

Я просто не уверен, как исправить мою проблему. Это продолжает говорить:

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

Номера для numpy функций, таких как math.abs() или math.log10(), не очень хорошо работают с numpy массивами. Просто замените строку, выдавшую ошибку:

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

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

92
Tom Pohl

Вот еще один способ воспроизвести эту ошибку в 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 , то увидите, что ожидается кортеж объектов с массивными массивами. Таким образом, окружение переменных паренами исправило это:

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. Это загадочная низкоуровневая ошибка python вызывает рвоту, когда получает неожиданные типы переменных, пытается убежать и что-то делать, проходит частично, рвёт, пытается исправить действие, дает сбой, затем говорит Вы, что "вы не можете переформулировать респондентов из подпространства, когда во вторник дует ветер с востока".

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

60
Eric Leschinski