2013-07-09 31 views
7

Tôi có một mảng NumPy nơi mỗi giá trị là một phao tiếp theo là một số nguyên, ví dụ:tiết kiệm một mảng NumPy với dữ liệu hỗn hợp

my_array = numpy.array([0.4324321, 0, 0.9437212, 1, 0.4738721, 0, 0.49327321, 0]) 

Tôi muốn lưu nó như thế này:

0.4324321 0 0.9437212 1 0.4738721 0 0.49327321 0 

Nhưng nếu tôi gọi:

numpy.savetxt('output.dat',my_array,fmt='%f %i') 

tôi nhận được một lỗi:

AttributeError: fmt has wrong number of % formats. %f %i 

Làm cách nào để khắc phục sự cố này?

+1

'savetxt' không phải là thành viên của loại' mảng'. Ý bạn là 'numpy.savetxt' ở đó? – abarnert

+0

Bằng cách này, nó sẽ thực sự giúp đỡ nếu bạn cho thấy những gì bạn muốn sản lượng dự kiến ​​trông giống như, thay vì làm cho chúng ta đoán. Không phải ngẫu nhiên mà ít nhất hai người thông minh khác nhau đã không đọc được suy nghĩ của bạn (hoặc có thể là hai người thông minh khác nhau cộng với một người thông minh như tôi; tôi không chắc mình đoán đúng)… – abarnert

+0

@abarnert Cảm ơn bạn đã bình luận, Tôi đã chỉnh sửa bài đăng để khắc phục cả hai vấn đề đó. – rhombidodecahedron

Trả lời

7

Vấn đề thực sự của bạn là in ra mảng 1D 8 phần tử cung cấp cho bạn 8 hàng 1 cột (hoặc, nếu bạn buộc mọi thứ, 1 hàng 8 cột), không phải 4 hàng của 2 cột. Vì vậy, bạn chỉ có thể chỉ định một định dạng duy nhất (hoặc, nếu bạn ép buộc mọi thứ, 1 hoặc 8 định dạng).

Nếu bạn muốn sản lượng này trong một hình dạng 4x2 thay vì 1x8, bạn cần phải định hình lại mảng đầu tiên:

numpy.savetxt('output.dat', my_array.reshape((4,2)), fmt='%f %i') 

này sẽ cung cấp cho bạn:

0.432432 0 
0.943721 1 
0.473872 0 
0.493273 0 

The docs là một chút bối rối , khi họ dành phần lớn từ ngữ để xử lý các số phức thay vì các phao đơn và ints, nhưng các quy tắc cơ bản là giống nhau. Bạn chỉ định một specifier duy nhất, hoặc một specifier cho mỗi cột (trường hợp ở giữa xác định các phần thực và ảo cho mỗi cột không liên quan).


Nếu bạn muốn viết nó thành 1 hàng 8 cột, trước tiên bạn cần định dạng lại thành hàng có 8 hàng thay vì 8 hàng.

Và sau đó bạn cần chỉ định 8 định dạng. Không có cách nào để nói với NumPy "lặp lại hai định dạng này gấp bốn lần", nhưng đó là khá dễ dàng để làm mà không cần sự giúp đỡ NumPy của:

numpy.savetxt('output.dat', my_array.reshape((1,8)), fmt='%f %i ' * 4) 

Và cung cấp cho bạn:

0.432432 0 0.943721 1 0.473872 0 0.493273 0 
+0

Thực ra tôi muốn định dạng 1x8. Có thể làm được điều đó không? – rhombidodecahedron

+0

1x8, không phải 8x1? OK, tôi cũng sẽ chỉ cách làm điều đó. – abarnert

1

Vấn đề là savetxt() sẽ in một hàng cho mỗi mục nhập mảng. Bạn có thể buộc tạo một trục mới và sau đó in định dạng (1x8):

numpy.savetxt('output.dat', my_array[numpy.newaxis,:], fmt='%f %i'*4) 
Các vấn đề liên quan