2014-12-16 29 views
7

Vì vậy, tôi có những gì tôi cảm thấy là một vấn đề rất câm.Đang cố gắng tách b '' khỏi mảng Numpy của tôi

tôi có thể tạo một mảng từ một tập tin:

A1=np.loadtxt(file, dtype='a100') 

Tôi muốn viết mảng rằng sau khi được xử lý xong vào tập tin khác:

np.savetxt("Test.txt", A1, fmt=%s, delimiter=',') 

Tại sao nó viết ra b'string '? Tôi nghĩ rằng tôi hiểu nó viết nó ra như là byte nhưng đối với cuộc sống của tôi tôi không thể tìm ra cách để viết nó ra mà không có b ''.

Tôi biết điều này có lẽ là điều gì đó cực kỳ dễ dàng mà tôi đang xem!

+4

Bạn có một biểu tượng. xem http://stackoverflow.com/questions/606191/convert-bytes-to-a-python-string –

+0

Cảm ơn, tôi sẽ xem xét. Có điều gì tôi có thể làm cho phần định dạng của savetext để sửa chữa nó? – user2624599

Trả lời

2

A1 được tải dưới dạng một mảng các chú thích. Python3 đã sử dụng các chuỗi unicode làm mặc định, vì vậy thường thêm chúng vào trước bằng 'b'. Điều đó là bình thường với print. Tôi hơi ngạc nhiên rằng nó cũng như vậy trong quá trình viết tệp.

Trong mọi trường hợp, điều này dường như làm các trick:

A2=np.array([x.decode() for x in A1]) 
np.savetxt("Test.txt", A2, fmt='%s', delimiter=',') 

A2 sẽ có một dtype như dtype='<U100'.


mảng thử nghiệm của tôi là:

array([b'one.com', b'two.url', b'three.four'], dtype='|S10') 

nạp từ một tập tin văn bản đơn giản:

one.com 
two.url 
three.four 

.decode là một phương pháp chuỗi. [x.decode() for x in A1] hoạt động cho một mảng 1d đơn giản của bytestrings. Nếu A1 là 2d, việc lặp lại phải được thực hiện trên tất cả các phần tử, không chỉ các hàng. Và nếu A1 là mảng có cấu trúc, phải được áp dụng cho các chuỗi trong các phần tử.


Một khả năng khác là sử dụng một bộ chuyển đổi trong thời gian tải, vì vậy bạn sẽ có được một mảng của (unicode) chuỗi

In [508]: A1=np.loadtxt('urls.txt', dtype='U', 
    converters={0:lambda x:x.decode()}) 
In [509]: A1 
Out[509]: 
array(['one.com', 'two.url', 'three.four'], dtype='<U10') 
In [510]: np.savetxt('test0.txt',A1,fmt='%s') 
In [511]: cat test0.txt 
one.com 
two.url 
three.four 

Các lib chứa loadtxt có một vài chức năng chuyển đổi, asbytes, asbytes_nested, và asstr. Vì vậy, converters cũng có thể là: converters={0:np.lib.npyio.asstr}.

genfromtxt xử lý này mà không converters:

A1=np.genfromtxt('urls.txt', dtype='U') 
# array(['one.com', 'two.url', 'three.four'], dtype='<U10') 

Để hiểu tại sao savetxt tiết kiệm chuỗi unicode như chúng ta muốn, nhưng gắn thêm các b cho bytestrings, chúng ta phải nhìn vào mã của nó.

np.savetxt (chạy trên py3) về cơ bản là:

fh = open(fname, 'wb') 
X = np.atleast_2d(X).T 
# make a 'fmt' that matches the columns of X (with delimiters) 
for row in X: 
    fh.write(asbytes(format % tuple(row) + newline)) 

Nhìn vào hai chuỗi mẫu (str và bytestr):

In [617]: asbytes('%s'%tuple(['one.two'])) 
Out[617]: b'one.two' 

In [618]: asbytes('%s'%tuple([b'one.two'])) 
Out[618]: b"b'one.two'" 

Viết vào một tập tin 'wb' loại bỏ mà lớp ngoài của b'', để phần bên trong cho dấu kiểm. Nó cũng giải thích tại sao các chuỗi ('plain' py3 unicode) được viết thành chuỗi 'latin1' vào tệp.


Bạn có thể viết trực tiếp một mảng bytestrings, không có savetxt. Ví dụ:

A0 = array([b'one.com', b'two.url', b'three.four'], dtype='|S10') 
with open('test0.txt','wb') as f: 
    for x in A0: 
     f.write(x+b'\n') 

cat test0.txt 
    one.com 
    two.url 
    three.four 

chuỗi Unicode cũng có thể được ghi trực tiếp, sản xuất cùng một tập tin:

A1 = array(['one.com', 'two.url', 'three.four'], dtype='<U10') 
with open('test1.txt','w') as f: 
    for x in A1: 
     f.write(x+'\n') 

Mã hóa mặc định cho một tập tin như vậy là encoding='UTF-8', giống như sử dụng với 'one.com'.encode(). Ảnh hưởng của nó cũng giống như những gì savetxt làm:

with open('test1.txt','wb') as f: 
    for x in A1: 
     f.write(x.encode()+b'\n') 

np.char.encode.decode phương pháp, mà có vẻ như hoạt động lặp đi lặp lại trên các yếu tố của một mảng.

Như vậy

np.char.decode(A1) # convert |S10 to <U10, like [x.decode() for x in A1] 
np.char.encode(A1) # convert <U10 to |S10 

này làm việc với mảng đa chiều

np.savetxt('testm.txt',np.char.decode(A_bytes[:,None][:,[0,0]]), 
    fmt='%s',delimiter=', ') 

Với một mảng cấu trúc, np.char.decode đã được áp dụng riêng cho từng lĩnh vực char.

+0

Tôi đã thử của bạn và đây là những gì tôi nhận được như là một lỗi: ''numpy.void' đối tượng không có thuộc tính 'decode'' – user2624599

+0

Dtype của' A1' là gì? Nếu 'x' là' numpy.void', tôi đoán nó là một phần tử của một mảng có cấu trúc. '.decode' là một phương thức' string'. – hpaulj

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