NumPy, 3 bayt ve 6 baytlık türleri için uint24
ve uint48
türlerine yönelik yerleşik desteğe sahip değildir. Bu türleri kullanarak büyük bir veri kümem var ve bunu numpy ile beslemek istiyorum. Şu anda (uint24 için) ne yapıyoruz:NumPy: 3 bayt, 6 baytlık türleri (aka 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
o 100MB girişi için işe yararken, bu (verinin 100s GBs düşünün) verimsiz görünüyor. Daha verimli bir yolu var mı? Örneğin, verilerin bir bölümünü maskeleyen özel bir salt okunur görünüm oluşturmak yararlı olabilir ("iki MSB ile her zaman sıfır" tip "). Sadece verilere salt okunur erişime ihtiyacım var.
+1. Probs buna değmez. – Joe
Yönteminiz daha güzel görünse de, tüm girdiyi birkaç kez okumaya ve değiştirilmiş bir kopyasını bellekte saklamaya devam eder. Hem sizin hem de orijinal çözümüm 100GB giriş için çalışmaz. –