2012-02-02 37 views
15

Có thể khởi tạo một lần lặp lại gọn gàng để giữ các chuỗi, mà không biết độ dài của các chuỗi trước không?Các chuỗi lặp lại có độ dài thay đổi

Là một (giả tạo) ví dụ:

mydf = np.empty((numrows,), dtype=[ ('file_name','STRING'), ('file_size_MB',float) ]) 

Vấn đề là tôi đang xây dựng recarray tôi trước Populating nó với thông tin, và tôi không nhất thiết phải biết chiều dài tối đa của file_name trước .

Tất cả những nỗ lực của tôi cho kết quả trong lĩnh vực chuỗi được cắt ngắn:

>>> mydf = np.empty((2,), dtype=[('file_name',str),('file_size_mb',float)]) 
>>> mydf['file_name'][0]='foobarasdf.tif' 
>>> mydf['file_name'][1]='arghtidlsarbda.jpg' 
>>> mydf 
array([('', 6.9164002347457e-310), ('', 9.9413127e-317)], 
     dtype=[('file_name', 'S'), ('file_size_mb', '<f8')]) 
>>> mydf['file_name'] 
array(['f', 'a'], 
     dtype='|S1') 

(Là một sang một bên, tại sao mydf['file_name'] show 'f' và 'a' trong khi mydf chương trình '' và ''?)

tương tự như vậy, nếu tôi khởi với kiểu (nói) |S10 cho file_name sau đó mọi thứ trở nên cắt ngắn tại chiều dài 10

Các câu hỏi tương tự duy nhất tôi có thể tìm thấy là this one, nhưng điều này calcu lates độ dài chuỗi thích hợp một priori và do đó không hoàn toàn giống như của tôi (như tôi không biết trước).

Có phương án nào khác ngoài việc gây quỹ file_name với (ví dụ) |S9999999999999 (tức là một số giới hạn trên vô lý) không?

+0

đây là một câu hỏi hay. chiều dài 0 dây trong recarrays chỉ có tôi xé tóc của tôi trong nửa giờ! – Christoph

Trả lời

24

Thay vì sử dụng kiểu chữ STRING dtype, người ta luôn có thể sử dụng object làm dtype. Điều đó sẽ cho phép bất kỳ đối tượng nào được gán cho một phần tử mảng, bao gồm các chuỗi độ dài biến của Python. Ví dụ:

>>> import numpy as np 
>>> mydf = np.empty((2,), dtype=[('file_name',object),('file_size_mb',float)]) 
>>> mydf['file_name'][0]='foobarasdf.tif' 
>>> mydf['file_name'][1]='arghtidlsarbda.jpg' 
>>> mydf 
array([('foobarasdf.tif', 0.0), ('arghtidlsarbda.jpg', 0.0)], 
     dtype=[('file_name', '|O8'), ('file_size_mb', '<f8')]) 

Việc chống lại tinh thần của khái niệm mảng có yếu tố chiều dài thay đổi, nhưng điều này gần như có thể đạt được. Ý tưởng của một mảng là các phần tử được lưu trữ trong bộ nhớ tại các địa chỉ bộ nhớ được xác định rõ và thường xuyên, ngăn cấm các phần tử có độ dài thay đổi. Bằng cách lưu trữ các con trỏ tới một chuỗi trong một mảng, người ta có thể phá vỡ giới hạn này. (Điều này về cơ bản là ví dụ trên.)

+0

cảm ơn vì điều đó - tôi chỉ chuyển từ ngôn ngữ R và về cơ bản muốn có một loại khung dữ liệu của đối tượng, và điều này làm việc tuyệt vời! –

+3

Nhận xét trễ: nếu bạn đang di chuyển từ R, hãy xem xét đối tượng pandas.DataFrame, có vẻ rất quen thuộc với bạn và xử lý chuỗi tốt. – mdurant

Các vấn đề liên quan