2012-03-31 30 views
17

Đây có phải là lỗi không?Ghép chuỗi yếu tố khôn ngoan ở dạng vón cục

import numpy as np 
a1=np.array(['a','b']) 
a2=np.array(['E','F']) 

In [20]: add(a1,a2) 
Out[20]: NotImplemented 

Tôi đang cố gắng nối chuỗi yếu tố khôn ngoan. Tôi nghĩ Add() là cách để làm điều đó một cách đầy đặn nhưng rõ ràng nó không hoạt động như mong đợi.

+1

Như tên của nó, số là dành cho số. Bản thân Python có các hoạt động chuỗi khá tốt. Tại sao không chỉ sử dụng? '" ".join ([" a "," b "])' hoạt động tốt. – Keith

+1

Tôi đã xem http://docs.scipy.org/doc/numpy/reference/routines.char.html – Dave31415

+2

Điều đó thật tuyệt. Nhưng: "Tất cả chúng đều dựa trên các phương thức chuỗi trong thư viện chuẩn Python." Vì vậy, nếu bạn chỉ cần sử dụng thư viện chuẩn, bạn có thể viết mã mà không phụ thuộc vào numpy. – Keith

Trả lời

30

Điều này có thể được thực hiện bằng numpy.core.defchararray.add. Dưới đây là ví dụ:

>>> import numpy as np 
>>> a1 = np.array(['a', 'b']) 
>>> a2 = np.array(['E', 'F']) 
>>> np.core.defchararray.add(a1, a2) 
array(['aE', 'bF'], 
     dtype='<U2') 

Có một số khác hữu ích string operations khả dụng cho các loại dữ liệu NumPy.

+0

Các hoạt động chuỗi 'add' mà bạn liên kết cung cấp cho một' NotImplemented' (như trong câu hỏi) cho một khối 1.6.1 dưới python 3.2. Bạn có biết phiên bản nào được triển khai không? –

+0

@FrancescoMontesano kiểm tra kết hợp phiên bản đó trên Ubuntu 12.04.2 LTS, ví dụ trong câu trả lời của tôi hoạt động như mong đợi. Nói chung, việc sử dụng 'np.add' cũng tăng' NotImplemented' với bất kỳ phiên bản nào. Đảm bảo bạn đang sử dụng 'np.core.defchararray.add'. –

+0

Bây giờ tôi đã nhìn thấy chữ ký đầy đủ của 'add' trong tài liệu (tôi đã bỏ lỡ điều đó trước đây). Dù sao, sẽ được tốt đẹp nếu numpy sẽ quấn 'np.core.defchararray. *' Vào tương ứng với các hoạt động ndarray số. Tôi nghĩ rằng nó neater nhiều và dễ nhớ để làm 'np.add'. –

4

này có thể (và nên) được thực hiện trong tinh khiết Python, như numpy cũng sử dụng các chức năng thao tác chuỗi Python nội bộ:

>>> a1 = ['a','b'] 
>>> a2 = ['E','F'] 
>>> map(''.join, zip(a1, a2)) 
['aE', 'bF'] 
+0

Ok, do đó, chức năng thêm tôi đang sử dụng không ở mức cao nhất trong chế độ gọn gàng. Là một trong những người nhanh hơn/tốt hơn hoặc ưa thích vì lý do nào? – Dave31415

+7

Điều này không trả lời được câu hỏi. Có những lúc người ta có thể muốn làm điều này một cách đầy đặn, ví dụ: khi làm việc với các mảng lớn của chuỗi. Các poster ban đầu đã đưa ra một ví dụ đơn giản mà một trong những sẽ sử dụng Python tinh khiết, nhưng đã được yêu cầu cho một giải pháp numpy. – Thucydides411

+0

@ Thucydides411 Từ những gì tôi hiểu tại thời điểm viết câu trả lời của tôi, numpy chỉ được sử dụng nguyên gốc Python dựng sẵn, vì vậy tôi đã không thấy những lợi thế mà sẽ có. Không chắc liệu điều đó có đúng hay không, có vẻ như không phải vậy. Có lẽ tôi đã hiểu sai câu lệnh "Tất cả chúng đều dựa trên các phương thức chuỗi trong thư viện chuẩn Python." trong tài liệu –

1

Một giải pháp khác là chuyển đổi mảng chuỗi thành mảng của python của các đối tượng để str.add đó được gọi là:

>>> import numpy as np 
>>> a = np.array(['a', 'b', 'c', 'd'], dtype=np.object) 
>>> print a+a 
array(['aa', 'bb', 'cc', 'dd'], dtype=object) 

Đây không phải là chậm (ít hơn gấp đôi chậm như thêm mảng số nguyên).

7

You can use the chararray subclass để thực hiện các hoạt động mảng với chuỗi:

a1 = np.char.array(['a', 'b']) 
a2 = np.char.array(['E', 'F']) 

a1 + a2 
#chararray(['aE', 'bF'], dtype='|S2') 

một ví dụ tốt đẹp:

b = np.array([2, 4]) 
a1*b 
#chararray(['aa', 'bbbb'], dtype='|S4') 
+0

Từ tài liệu, _ "nó không được khuyến khích cho phát triển mới" _ – Eric

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