NumPy में 3-बाइट और 6-बाइट प्रकार, उर्फ uint24
और uint48
के लिए अंतर्निहित समर्थन की कमी दिखाई देती है। मेरे पास इन प्रकारों का उपयोग करके एक बड़ा डेटा सेट है और इसे खराब करने के लिए फ़ीड करना चाहते हैं। क्या मैं इस समय (uint24 के लिए) कार्य करें:NumPy: 3-बाइट, 6-बाइट प्रकार (उर्फ uint24, uint48)
import numpy as np
dt = np.dtype([('head', '<u2'), ('data', '<u2', (3,))])
# I would like to be able to write
# dt = np.dtype([('head', '<u2'), ('data', '<u3', (2,))])
# dt = np.dtype([('head', '<u2'), ('data', '<u6')])
a = np.memmap("filename", mode='r', dtype=dt)
# convert 3 x 2byte data to 2 x 3byte
# w1 is LSB, w3 is MSB
w1, w2, w3 = a['data'].swapaxes(0,1)
a2 = np.ndarray((2,a.size), dtype='u4')
# 3 LSB
a2[0] = w2 % 256
a2[0] <<= 16
a2[0] += w1
# 3 MSB
a2[1] = w3
a2[1] <<=8
a2[1] += w2 >> 8
# now a2 contains "uint24" matrix
हालांकि यह 100 एमबी इनपुट के लिए काम करता है, यह अक्षम लग रहा है (डेटा के 100s GB का के बारे में सोच)। क्या कोई और अधिक प्रभावी तरीका है? उदाहरण के लिए, एक विशेष प्रकार का केवल पढ़ने वाला दृश्य बनाना जो डेटा का मुखौटा हिस्सा उपयोगी होगा ("यूआईएस 64" दो एमएसबी हमेशा शून्य "प्रकार के साथ)। मुझे केवल डेटा तक केवल पढ़ने की आवश्यकता है।
+1। Probs इसके लायक नहीं है। – Joe
आपकी विधि अच्छी तरह दिखती है, फिर भी यह पूरे इनपुट को कई बार पढ़ती है और स्मृति में एक संशोधित प्रति संग्रहित करती है। आपका और मेरा मूल समाधान दोनों 100 जीबी इनपुट के लिए काम नहीं करेगा। –