2012-04-04 97 views
68

Lưu ý: Yêu cầu đảo ngược chuyển đổi tuple-to-mảng thông thường.Chuyển đổi mảng numpy thành tuple

Tôi phải chuyển đối số cho hàm (được gói C++) dưới dạng bộ lồng lồng nhau. Ví dụ, sau đây làm việc

X = MyFunction(((2,2),(2,-2))) 

trong khi sau không

X = MyFunction(numpy.array(((2,2),(2,-2)))) 
X = MyFunction([[2,2],[2,-2]]) 

Thật không may, lập luận tôi muốn sử dụng đến với tôi như một mảng NumPy. Mảng đó luôn có kích thước 2xN cho một số N, có thể khá lớn.

Có cách nào dễ dàng chuyển đổi dữ liệu đó thành bộ tuple không? Tôi biết rằng tôi chỉ có thể lặp qua, tạo ra một tuple mới, nhưng sẽ thích nếu có một số truy cập tốt đẹp mảng numpy cung cấp.

Nếu không thể thực hiện điều này một cách độc đáo như tôi hy vọng, cách nào đẹp nhất để làm điều đó bằng cách lặp lại hoặc bất cứ điều gì?

Trả lời

83
>>> arr = numpy.array(((2,2),(2,-2))) 
>>> tuple(map(tuple, arr)) 
((2, 2), (2, -2)) 
17

Dưới đây là một chức năng mà sẽ làm điều đó:

def totuple(a): 
    try: 
     return tuple(totuple(i) for i in a) 
    except TypeError: 
     return a 

Và một ví dụ:

>>> array = numpy.array(((2,2),(2,-2))) 
>>> totuple(array) 
((2, 2), (2, -2)) 
+1

Tổng quát tốt đẹp. Là một newbie python, mặc dù, tôi tự hỏi nếu nó được coi là phong cách tốt để sử dụng ngoại lệ cho một điều kiện đó là gần như là phổ biến như là nhà nước không đặc biệt. Ít nhất trong c + +, kiểm soát dòng chảy bởi các ngoại lệ thường bị cau mày. Nó sẽ là tốt hơn để kiểm tra nếu 'loại (a) == numpy.ndarray'? – Mike

+8

Điều này khá phổ biến ở python vì khái niệm "duck-typing" và EAFT, ở đây: http://docs.python.org/glossary.html#term-duck-typing. Ưu điểm của phương pháp này là nó sẽ chuyển đổi bất kỳ chuỗi lồng nhau nào thành các bộ dữ liệu lồng nhau, không chỉ là một mảng. Một điều tôi nên làm mà tôi đã cố định là xác định lỗi nào tôi muốn được xử lý bởi khối ngoại trừ. –

+2

Trong C++, các ngoại lệ chậm so với điều kiện vì nhiều lý do. Trong Python, chúng xấp xỉ về mặt hiệu năng - đây là một trong những nơi mà chúng ta phải kiểm tra trực giác C++ của chúng ta ở cửa. – dbn

0

tôi đã không hài lòng, vì vậy cuối cùng tôi đã sử dụng này:

.210

i: a = numpy.array ([[1,2,3], [4,5,6]])

i: a

o: mảng ([[1, 2, 3 ], [4, 5, 6]])

i: tuple (a.reshape (1, -1) [0])

o: (1, 2, 3, 4, 5, 6)

I don' t biết nếu nó nhanh hơn, nhưng có vẻ hiệu quả hơn;)

+2

Đó không phải là hình dạng mà tôi muốn cho tuple. – Mike

1

Một tùy chọn khác

tuple([tuple(row) for row in myarray]) 

Nếu bạn đang đi qua mảng NumPy chức năng C++, bạn cũng có thể muốn xem xét sử dụng Cython hoặc SWIG.

+0

Điều đó không chuyển đổi thành bộ tuple. Chuyển đổi thành danh sách? – Peter

+0

Bạn đã thử chưa? Nó tạo ra một tuple khi tôi chạy. Lưu ý rằng hàm cuối cùng được gọi là tuple, trả về một tuple. Nếu bạn chỉ có phần [...] mà không có tuple bên ngoài, bạn sẽ nhận được một danh sách các bộ dữ liệu. –

+0

Hmm xin lỗi về điều đó; bạn đúng. Tôi đã có một chút buồn ngủ đêm qua và thấy một danh sách trở lại vì vậy yeah, nó phải có được một danh sách với một tuple bên trong. – Peter

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