TypeError: chỉ các mảng độ dài-1 mới có thể được chuyển đổi thành vô hướng Python trong khi cố gắng khớp dữ liệu theo cấp số nhân


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

Tôi chỉ không chắc về cách khắc phục sự cố của mình. Nó tiếp tục nói:

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

18
Khi bạn cấp một danh sách python gốc như [1,2,3] cho một phương thức numpy mong đợi một mảng numpy, bạn sẽ gặp lỗi này. Phương thức numpy đó lấy danh sách python gốc của bạn, và cố gắng tiêu hóa nó, và sâu xuống nó sẽ tạo ra phản hồi này. Một thông báo lỗi thân thiện hơn với người dùng sẽ là: 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 thực sự làm rơi quả bóng vào cái đó, thông báo lỗi đó thật khủng khiếp.
Eric Leschinski

Câu trả lời:


100

Các hàm không numpy thích math.abs()hoặc math.log10()không hoạt động độc đáo với các mảng numpy. Chỉ cần thay thế dòng ghi lỗi bằng:

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

Ngoài ra, np.polyfit()cuộc gọi sẽ không hoạt động vì nó thiếu tham số (và dù sao thì bạn cũng không gán kết quả để sử dụng thêm).


1
Câu trả lời chính xác. Thêm vào đó, tôi nghĩ rằng không có hàm toán học nào hoạt động với mảng numpy. Tốt hơn hãy thay đổi chúng bằng các chức năng numpy.
endertunc

Cảm ơn rất nhiều! Tôi đang đối mặt với một vấn đề tương tự với math.power kết hợp với các hàm numpy khác. Thay thế math.power bằng numpy.power đã giải quyết được vấn đề.
Aurgho Bhattacharjee

65

Đây là một cách khác để tạo lại lỗi này trong Python2.7 với 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) 

Các np.concatenatephương pháp tạo ra một lỗi:

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

Nếu bạn đọc tài liệu về numpy.concatenate , thì bạn sẽ thấy nó mong đợi một loạt các đối tượng mảng numpy. Vì vậy, xung quanh các biến bằng parens đã sửa nó:

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) 

Sau đó, nó in:

[1 2 3 4 5 6]

Những gì đang xảy ra ở đây?

Lỗi đó là một trường hợp triển khai bong bóng - nó là do triết lý gõ vịt của python. Đây là một lỗi khó hiểu ở mức độ thấp, python tức giận khi nó nhận được một số loại biến không mong muốn, cố gắng chạy đi và làm điều gì đó, vượt qua một cách khó hiểu, lỗi, cố gắng khắc phục, không thành công, sau đó nói với bạn rằng "bạn có thể" t định dạng lại các máy phản ứng vũ trụ con khi gió thổi từ phía đông vào thứ Ba ".

Trong các ngôn ngữ hợp lý hơn như C ++ hoặc Java, nó sẽ cho bạn biết: "bạn không thể sử dụng TypeA mà TypeB được mong đợi". Nhưng Python làm tốt nhất là bắt đầu, thực hiện điều gì đó không xác định, thất bại và sau đó trả lại cho bạn một lỗi không hữu ích. Thực tế chúng ta phải thảo luận về điều này là một trong những lý do khiến tôi không thích Python, hoặc triết lý gõ đầu vịt của nó.


5
vẫn xảy ra ở trăn 3 và giết tôi một cách bí ẩn.
Christophe

Hãy thử sử dụng trình gỡ lỗi pdb để cung cấp cho bạn thêm thông tin về lỗi: docs.python.org/3/library/pdb.html
Eric Leschinski

1
ồ xin lỗi bài viết của tôi không rõ ràng. Ý tôi là tôi đã gặp vấn đề tương tự với concatenate và câu trả lời của bạn đã giải quyết nó cho tôi. Bạn đã đề cập rằng đó là một lỗi (tính năng?) Với Python2.7 và numpy, nó vẫn tồn tại với python3 và numpy :)
Christophe

6
"Bạn không thể refromulate các phản ứng không gian con khi gió thổi từ phía đông vào thứ ba:" Tôi giống như bạn
rosstex

1
Này anh bạn, tôi sẽ không trả cho bạn 70 smidgens cho một trình chống phân mảnh bị hỏng. youtube.com/watch?v=Xk5A4QWyl1U
Eric Leschinski
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.