Помилка TypeError: лише масиви length-1 можуть бути перетворені в скаляри Python при спробі експоненціально підігнати дані


76
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

18
Коли ви подасте рідний список пітонів, як [1,2,3], методу numpy, який очікує масив numpy, ви отримаєте цю помилку. Цей метод numpy бере ваш рідний список python і намагається його переварити, і глибоко внизу він викликає цю відповідь. Більш зручним для користувача повідомленням про помилку було б: TypeError: Don't feed native python lists into numpy functions that expect numpy arrays. Either convert your python list to a numpy array or package your python lists into a tuple. Python numpy справді кинув м'яч на це, це повідомлення про помилку жахливо.
Ерік Лещинський

Відповіді:


100

Функції, що не є numpy, подобаються math.abs()чи math.log10()не грають добре з масивами numpy. Просто замініть рядок, що викликає помилку, на:

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

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


1
Чудова відповідь. На додаток до цього, я думаю, що жодна з математичних функцій не працює з масивами numpy. Краще змінити їх за допомогою функцій numpy.
endertunc

Дуже дякую! Я стикався з подібною проблемою з math.power у поєднанні з іншими функціями numpy. Заміна math.power на numpy.power вирішила проблему.
Aurgho Bhattacharjee

65

Ось ще один спосіб відтворити цю помилку в 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. Отже, оточуючи змінні за допомогою парен, це виправлено:

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. Це загадкова помилка низького рівня, коли кишки пітона кидаються, коли він отримує якісь несподівані типи змінних, намагається втекти і щось зробити, проходить частину шляху, блює, намагається виправити помилку, не вдається, а потім каже вам, що "ви можете" t переформулювати відповіді підпростору, коли у вівторок вітер дме зі сходу ".

У більш розумних мовах, таких як C ++ або Java, це сказав би вам: "ви не можете використовувати TypeA там, де очікували TypeB". Але Python робить все можливим, щоб солдатись далі, робить щось невизначене, не вдається, а потім передає вам непотрібну помилку. Той факт, що ми повинні обговорювати це, є однією з причин, чому я не люблю Python або його філософію набору качок.


5
все ще трапляється в python 3 і вбив мене загадково.
Крістоф

Спробуйте скористатися налагоджувачем pdb,
Ерік Лещинський

1
ой вибачте, мій пост був незрозумілим. Я мав на увазі, що у мене така ж проблема з конкатенатом, і ваша відповідь вирішила це для мене. Ви згадали, що це помилка (особливість?) З Python2.7 та numpy, вона все ще існує з python3 та numpy :)
Крістоф

6
"Ви не можете відновити реагування на підпростір, коли вівторок вітер дме зі сходу" Мені подобається, ти
rosstex

1
Дивись, брате, я не збираюся платити тобі 70 сідгенів за зламаний дефракулятор. youtube.com/watch?v=Xk5A4QWyl1U
Ерік Лещинський
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.