2012-03-22 32 views
8

Tôi có một mảng NumPy 2 chiều trông như thế này:Làm thế nào để in các mảng Numpy mà không có bất kỳ ký pháp bổ sung nào (dấu ngoặc vuông [] và dấu cách giữa các phần tử)?

[[a b c] 
[d e f] 
[g h i]] 

tôi muốn in nó mà không có bất kỳ mặc định khuẩn kí hiệu thường đi kèm với các mảng; cụ thể là [, ] và khoảng trắng giữa các phần tử. Một cái gì đó như thế này:

abc 
def 
ghi 

Có thể thực hiện một điều như vậy (tất nhiên là không có vòng lặp Python tầm thường và đắt tiền)?

Tôi đã xem numpy.set_printoptions nhưng có vẻ như nó chỉ đặt tùy chọn trình bày cho cách các phần tử được hiển thị, chứ không phải các ký tự ở giữa.

Chỉnh sửa: Các phần tử trong mảng có biểu diễn chuỗi có thể là bất kỳ thứ gì, bao gồm [, ] và khoảng trắng. Chẳng hạn tối thiểu của làm thế nào để xây dựng một mảng như:

class custom(object): 
    def __repr__(self): 
     return 'a' 
a = numpy.empty((5, 5), custom) 
a.fill(custom()) 
print a 
+0

Chỉ cần được rõ ràng: repr tùy chỉnh của bạn bao gồm một thiết bị đầu cuối '.' mà bạn muốn để thoát khỏi, nhưng có thể bao gồm những người khác mà bạn không? Tôi không chắc tôi hiểu những gì bạn muốn bỏ. – DSM

+0

Tệ của tôi, điều này là do tôi chỉnh sửa biểu diễn bằng tay. Câu hỏi ban đầu của tôi đã sử dụng một loạt các số thường xuyên, mà có một '.' sau mỗi số được sử dụng làm dấu phân cách (hoặc dấu tách thập phân, không chắc chắn). Sau đó, tôi đã chỉnh sửa câu hỏi của mình để phản ánh rằng kiểu dữ liệu của mảng không nhất thiết là số, và quên thay đổi dấu phân tách cho phù hợp. Đã chỉnh sửa lại. –

+0

Tập hợp con: chỉ xóa '[]': http://stackoverflow.com/questions/9360103/how-to-print-a-numpy-array-without-brackets/42046765#42046765 –

Trả lời

8

Trong khi điều này một lượng khá nhiều cho một vòng lặp, tôi nghĩ rằng đây có lẽ là tốt nhất bạn sẽ nhận được. Nói chung, phương pháp chuỗi join là khá nhanh.

>>> a = np.array([[1,2,3],[2,4,6],[-1,-2,-3]]) 
>>> print '\n'.join(''.join(str(cell) for cell in row) for row in a) 
123 
246 
-1-2-3 

Tôi nghĩ rằng vào thời điểm này, bạn có thể nên thực hiện điều gì đó tốt nhất và đo thời gian cần thiết. Tôi đoán là phần chậm nhất của mã sẽ thực sự được in ra bàn điều khiển, chứ không phải nối các chuỗi lại với nhau.

+0

Vâng, tôi đoán điều đó có nghĩa là không có "cách numpy" để làm điều đó. Thanks anyway –

0
>>> import numpy  
>>> a = numpy.array([[ 1.0, 2, 3], [ 4, 5, 6], [ 7, 8, 9]]) 
>>> print str(a).replace(' ','').replace('.','').replace('[','').replace(']','') 
123 
456 
789 
+0

+1 bởi vì nó trả lời câu hỏi Tôi hỏi, nhưng mảng thực sự trong câu hỏi sử dụng một kiểu dữ liệu tùy chỉnh mà biểu diễn chuỗi có thể là bất cứ điều gì, bao gồm cả dấu cách và dấu ngoặc đơn. Đã chỉnh sửa câu hỏi để phản ánh điều này –

+0

@Etienne Perot - quay lại bảng vẽ! – fraxel

3
np.savetxt(sys.stdout.buffer, a, fmt='%s', delimiter='') 
+0

Bạn có thực sự cần '.buffer' tại' sys.stdout.buffer' không? –

0

Nó khá đơn giản, nếu a là mảng của bạn chỉ cần làm điều này:

print(re.sub('[ ]+', ' ', re.sub(' *[\\[\\]] *', '', np.array_str(a)))) 
Các vấn đề liên quan