2010-11-03 14 views
10

मेरे पास एक फ़ाइल रीडर है जो फ़ाइल से n बाइट्स पढ़ता है और उस (बाइनरी) डेटा का प्रतिनिधित्व करने वाले वर्णों की एक स्ट्रिंग देता है। मैं संख्याओं की एक संख्यात्मक सरणी में n बाइट्स को पढ़ना चाहता हूं और उस पर एक एफएफटी चला सकता हूं, लेकिन मुझे स्ट्रिंग से सरणी बनाने में समस्या हो रही है। उदाहरण की एक दो पंक्तियां भयानक होंगी।मैं स्ट्रिंग से एक numpy सरणी कैसे बना सकता हूँ?

संपादित करें: मैं कच्चे बाइनरी डेटा पढ़ रहा हूँ, और इसलिए स्ट्रिंग मैं '\x01\x05\x03\xff'... की तरह दिखता है मिलता है। मैं इसे [1, 5, 3, 255] बनना चाहता हूं।

+0

उस स्ट्रिंग का कोई उदाहरण? – kennytm

+0

डेटा संरचना का उदाहरण जिसके साथ आप काम कर रहे हैं? –

उत्तर

20

आप numpy.fromstring के साथ सीधे कर सकते हैं:

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

एक बार इसे पूरा करने के बाद, aarray([ 1, 5, 3, 255]) है और आप नियमित scipy/numpy एफएफटी दिनचर्या का उपयोग कर सकते हैं।

+0

क्या एक बार में एक बार में दो बाइट्स पढ़ने के लिए कोई तरीका है? – erjiang

+0

यह साफ है - मुझे उस विधि के बारे में पता नहीं था। मैंने बस इसे आज़मा दिया और 'सरणी ([1, 5, 3, -1], dtype = int8) प्राप्त कर रहा हूं। कोई विचार यह क्या हो सकता है? – dtlussier

+0

एक के बजाय एक बार में दो बाइट्स पढ़ने के लिए, आप dtype तर्क को 'int16',' uint16' जैसे किसी अन्य चीज़ में बदल सकते हैं - एक बार जब आप एकाधिक-बाइट स्ट्रिंग में जाते हैं, तो आपको आउटपुट को आउटपुट करना पड़ सकता है बाइट ऑर्डर सही ढंग से प्राप्त करने के लिए। बस 'a = np.fromstring (...)' के साथ 'a = np.fromstring (...)। Byteswap()'। –

1
यह कठिन है में आप क्या आ गया गया है बिना जाने

, लेकिन अगर यह अल्पविराम से परे थे पूर्णांकों तुम कर सकते हो कुछ इस तरह:

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]) 
संबंधित मुद्दे