2012-03-31 39 views
18

Đang cố gắng để chuyển đổi mảng int để mảng chuỗi trong NumPyChuyển đổi mảng int để mảng chuỗi trong NumPy mà không cần cắt ngắn

In [66]: a=array([0,33,4444522]) 
In [67]: a.astype(str) 
Out[67]: 
array(['0', '3', '4'], 
     dtype='|S1') 

Không phải những gì tôi dự định

In [68]: a.astype('S10') 
Out[68]: 
array(['0', '33', '4444522'], 
     dtype='|S10') 

này hoạt động nhưng tôi đã biết 10 là đủ lớn để giữ sợi dài nhất của tôi. Có cách nào để thực hiện điều này một cách dễ dàng mà không biết trước chuỗi kích thước bạn cần không? Có vẻ như một chút nguy hiểm mà nó chỉ lặng lẽ cắt ngắn chuỗi của bạn mà không ném một lỗi.

+0

Đối với du khách từ năm 2018 và xa hơn: 'a.astype (str)' bây giờ sẽ làm việc chính xác như mong muốn. – Raketenolli

Trả lời

30

Một lần nữa, điều này có thể được giải quyết bằng Python tinh khiết:

>>> map(str, [0,33,4444522]) 
['0', '33', '4444522'] 

Hoặc nếu bạn cần phải chuyển đổi qua lại:

>>> a = np.array([0,33,4444522]) 
>>> np.array(map(str, a)) 
array(['0', '33', '4444522'], 
     dtype='|S7') 
+0

Cảm ơn. Tôi đoán tôi cần phải làm quen với bản đồ hơn. – Dave31415

2

Bạn có thể tìm thấy đủ chiều rộng nhỏ nhất như vậy:

In [3]: max(len(str(x)) for x in [0,33,4444522]) 
Out[3]: 7 

Hoặc, chỉ cần xây dựng ndarray từ danh sách các chuỗi:

In [7]: np.array([str(x) for x in [0,33,4444522]]) 
Out[7]: 
array(['0', '33', '4444522'], 
     dtype='|S7') 

hay, sử dụng map():

In [8]: np.array(map(str, [0,33,4444522])) 
Out[8]: 
array(['0', '33', '4444522'], 
     dtype='|S7') 
+0

Đối với mảng lớn, 'map()' là một lựa chọn tốt hơn so với danh sách hiểu bởi vì nó đẩy việc thực thi mã vào C. –

+1

@JoelCornett Đôi khi 'map' có thể nhanh hơn một chút (trong ví dụ này nhanh hơn khoảng 3%) bằng cách sử dụng một danh sách hiểu cho tôi), nhưng điều này không phải lúc nào cũng như vậy, và việc hiểu danh sách được coi là nhiều hơn về mặt nhiệt đới. Xem http://stackoverflow.com/a/1247490/1191119 – jorgeca

+2

@jorgeca: Tuyệt đối, không phải lúc nào cũng vậy. Ngẫu nhiên, khi tôi đang thực hiện nghiên cứu, tôi đã bắt đầu [bài viết ngộ nghĩnh này] (http://www.python.org/doc/essays/list2str.html) của Guido. –

28

Bạn có thể ở trong NumPy, làm

np.char.mod('%d', a) 

Đây là hai lần nhanh hơn so với map hoặc danh sách comprehensions trong 10 yếu tố, bốn lần nhanh hơn cho 100. Thao tác này và chuỗi ký tự khác được ghi thành tài liệu here.

+0

Tuyệt vời, nhưng tôi không thể tìm thấy tài liệu cho việc này, bạn có thể cung cấp liên kết nếu có thể không? –

+0

@MikhailV Chắc chắn, chỉ cần thêm liên kết vào câu trả lời. – jorgeca

0

np.apply_along_axis(lambda y: [str(i) for i in y], 0, x)

Ví dụ

>>> import numpy as np 

>>> x = np.array([-1]*10+[0]*10+[1]*10) 
array([-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 
     0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]) 

>>> np.apply_along_axis(lambda y: [str(i) for i in y], 0, x).tolist() 
['-1', '-1', '-1', '-1', '-1', '-1', '-1', '-1', '-1', '-1', '0', '0', 
'0', '0', '0', '0', '0', '0', '0', '0', '1', '1', '1', '1', '1', '1', 
'1', '1', '1', '1'] 
Các vấn đề liên quan