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
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
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. –