2011-12-11 48 views
21

Tôi đang sử dụng một thao tác được đặt trong python để thực hiện sự khác biệt đối xứng giữa hai mảng numpy. Kết quả, tuy nhiên, là một bộ và tôi cần phải chuyển đổi nó trở lại một mảng numpy để di chuyển về phía trước. Có cách nào để làm việc này không? Đây là những gì tôi đã cố gắng:Làm thế nào để chuyển đổi một bộ python thành một mảng numpy?

a = numpy.array([1,2,3,4,5,6]) 
b = numpy.array([2,3,5]) 
c = set(a)^set(b) 

Kết quả là một tập hợp:

In [27]: c 
Out[27]: set([1, 4, 6]) 

Nếu tôi chuyển sang một mảng NumPy, nó đặt toàn bộ nhóm bằng các phần tử mảng đầu tiên.

In [28]: numpy.array(c) 
Out[28]: array(set([1, 4, 6]), dtype=object) 

gì tôi cần, tuy nhiên, sẽ là thế này:

array([1,4,6],dtype=int) 

tôi có thể lặp trên các yếu tố để chuyển đổi từng người một, nhưng tôi sẽ có 100.000 yếu tố và hy vọng cho một hàm built-in để lưu vòng lặp. Cảm ơn!

Trả lời

24

Không chuyển đổi mảng NumPy để một bộ để thực hiện độc quyền-hoặc. Sử dụng trực tiếp setxor1d.

>>> import numpy 
>>> a = numpy.array([1,2,3,4,5,6]) 
>>> b = numpy.array([2,3,5]) 
>>> numpy.setxor1d(a, b) 
array([1, 4, 6]) 
+0

Có sử dụng các thói quen thiết lập gọn gàng, chẳng hạn như 'setxor1d', xấu khi số lượng so sánh lớn không? Có lẽ một câu hỏi mới, nhưng rất liên quan đến câu trả lời này tôi nghĩ. Trong trường hợp của tôi, tôi sẽ có 100k đối tượng với các hoạt động thiết lập 10m +. – Annan

26

Đỗ:

>>> numpy.array(list(c)) 
array([1, 4, 6]) 

Và dtype là int (Int64 đứng về phía tôi.)

+0

Cảm ơn Tito! Bây giờ tôi thấy KennyTM đã có một câu trả lời hiệu quả hơn, nhưng bạn cũng đã làm việc tốt! – mishaF

+4

Điều này thực sự trả lời câu hỏi trong tiêu đề. –

5

Hãy thử điều này.

numpy.array(list(c)) 

Chuyển đổi thành danh sách trước khi khởi tạo mảng khối sẽ đặt các phần tử riêng thành số nguyên chứ không phải phần tử đầu tiên làm đối tượng.

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