2010-11-03 28 views
10

Tôi có trình đọc tệp đọc n byte từ tệp và trả về một chuỗi ký tự đại diện cho dữ liệu (nhị phân) đó. Tôi muốn đọc lên n byte vào một dãy số sần và chạy FFT trên số, nhưng tôi đang gặp sự cố khi tạo mảng từ chuỗi. Một vài dòng ví dụ sẽ là tuyệt vời.Tôi làm cách nào để tạo một mảng numpy từ chuỗi?

Chỉnh sửa: Tôi đang đọc dữ liệu nhị phân thô và do đó chuỗi tôi nhận được trông giống như '\x01\x05\x03\xff'.... Tôi muốn điều này trở thành [1, 5, 3, 255].

+0

Bất kỳ ví dụ nào về chuỗi đó? – kennytm

+0

Ví dụ về cấu trúc dữ liệu bạn đang làm việc với? –

Trả lời

20

Bạn có thể làm điều này trực tiếp với numpy.fromstring:

import numpy as np 
s = '\x01\x05\x03\xff' 
a = np.fromstring(s, dtype='uint8') 

Sau khi hoàn tất việc này, aarray([ 1, 5, 3, 255]) và bạn có thể sử dụng các thủ tục FFT scipy/numpy thường xuyên.

+0

Có cách nào để làm cho nó đọc hai byte cùng một lúc thay vì một byte không? – erjiang

+0

Đó là gọn gàng - Tôi không biết về phương pháp đó trong vòng gumpy. Tôi chỉ cần thử nó và nhận được 'mảng ([1, 5, 3, -1], dtype = int8)' trở lại thay vào đó. Bất kỳ ý tưởng những gì có thể gây ra điều này? – dtlussier

+0

Để đọc hai byte tại một thời điểm thay vì một, bạn có thể thay đổi đối số dtype thành một cái gì đó khác như 'int16',' uint16' - một khi bạn nhận được các chuỗi nhiều byte, bạn có thể phải gửi byte đầu ra theo thứ tự để có được thứ tự byte một cách chính xác. Chỉ cần thay thế 'a = np.fromstring (...)' bằng 'a = np.fromstring (...). Byteswap()'. –

1

Mà không biết những gì bạn đã đã đến trong đó là khó khăn, nhưng nếu nó được dấu phẩy số nguyên phân định bạn có thể làm một cái gì đó như thế này:

myInts = map(int, myString.split(',')) 
5
>>> '\x01\x05\x03\xff' 
'\x01\x05\x03\xff' 
>>> map(ord, '\x01\x05\x03\xff') 
[1, 5, 3, 255] 
>>> numpy.array(map(ord, '\x01\x05\x03\xff')) 
array([ 1, 5, 3, 255]) 
Các vấn đề liên quan