2013-02-01 36 views
37

Tôi là một tân binh hoàn chỉnh đối với Python, nhưng có vẻ như một chuỗi đã cho có thể có độ dài tùy ý (hiệu quả). I E. bạn có thể lấy một số string str và tiếp tục thêm vào nó: str += "some stuff...". Có cách nào để tạo một chuỗi các chuỗi như vậy không?mảng python numpy của các chuỗi dài tùy ý

Khi tôi cố gắng này, mỗi phần tử chỉ lưu trữ một ký tự đơn

strArr = numpy.empty(10, dtype='string') 
for i in range(0,10) 
    strArr[i] = "test" 

Mặt khác, tôi biết tôi có thể khởi tạo một mảng các chuỗi dài nhất định, ví dụ:

strArr = numpy.empty(10, dtype='s256') 

mà có thể lưu trữ 10 chuỗi tối đa 256 ký tự

Trả lời

68

Bạn có thể làm như vậy bằng cách tạo một mảng dtype=object. Nếu bạn cố gắng gán một chuỗi dài để một mảng NumPy bình thường, nó truncates chuỗi:

>>> a = numpy.array(['apples', 'foobar', 'cowboy']) 
>>> a[2] = 'bananas' 
>>> a 
array(['apples', 'foobar', 'banana'], 
     dtype='|S6') 

Nhưng khi bạn sử dụng dtype=object, bạn nhận được một loạt các tài liệu tham khảo đối tượng python. Vì vậy, bạn có thể có tất cả những hành vi của chuỗi python:

>>> a = numpy.array(['apples', 'foobar', 'cowboy'], dtype=object) 
>>> a 
array([apples, foobar, cowboy], dtype=object) 
>>> a[2] = 'bananas' 
>>> a 
array([apples, foobar, bananas], dtype=object) 

Thật vậy, bởi vì nó là một mảng của các đối tượng, bạn có thể gán bất kỳ loại đối tượng python để mảng:

>>> a[2] = {1:2, 3:4} 
>>> a 
array([apples, foobar, {1: 2, 3: 4}], dtype=object) 

Tuy nhiên, điều này hoàn tác rất nhiều lợi ích của việc sử dụng gọn gàng, quá nhanh vì nó hoạt động trên các khối bộ nhớ thô liền kề lớn. Làm việc với các đối tượng python thêm rất nhiều chi phí. Một ví dụ đơn giản:

>>> a = numpy.array(['abba' for _ in range(10000)]) 
>>> b = numpy.array(['abba' for _ in range(10000)], dtype=object) 
>>> %timeit a.copy() 
100000 loops, best of 3: 2.51 us per loop 
>>> %timeit b.copy() 
10000 loops, best of 3: 48.4 us per loop 
+0

Cảm ơn, ví dụ đầu tiên của bạn đặc biệt hữu ích - Tôi chưa bao giờ đoán được hành vi đó! Tôi không lo lắng về tốc độ của đối tượng này, do đó truy cập chậm hơn sẽ ổn. – DilithiumMatrix

+1

Câu trả lời hay. Tôi đã kết hợp một liên kết đến nó với bản demo vào một trang máy tính xách tay python Tôi đang làm việc về tạo mảng numpy. –

11

Bạn có thể sử dụng loại dữ liệu đối tượng:

>>> import numpy 
>>> s = numpy.array(['a', 'b', 'dude'], dtype='object') 
>>> s[0] += 'bcdef' 
>>> s 
array([abcdef, b, dude], dtype=object) 
Các vấn đề liên quan