我想創建一個我的排序numpy數組的差異,如果我記錄第一行的值和差異,我可以重新創建原始表,但存儲較少的數據。Numpy和差異()
因此,這裏的表的例子:
my_array = numpy.array([(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1),
(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2),
(9, 36, 146, 73, 36, 146, 73, 36, 146, 73, 36, 146, 73, 34),
(9, 36, 146, 73, 36, 146, 73, 36, 146, 73, 36, 146, 73, 35),
(9, 36, 146, 73, 36, 146, 73, 36, 146, 73, 36, 146, 73, 36)
],'uint8,uint8,uint8,uint8,uint8,uint8,uint8,uint8,uint8,uint8,uint8,uint8,uint8,uint8')
運行numpy.diff(my_array)後,我會預料這樣的事情:
[(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1),
(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1),
(9, 36, 146, 73, 36, 146, 73, 36, 146, 73, 36, 146, 73, 32),
(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1),
(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1)
]
注意:以上數據來自 「真實」數據的最後三行,其數量要大得多。對於完整的數據集,差異後的大部分 行將爲0,0,0,0,0,0,0,0,0,0,0,0,1 - 可將a) 存儲在一個小得多的結構,和b)將在磁盤上非常好地壓縮,因爲大多數行包含非常相似的數據。
我應該指出,我有一大堆uint8的原因是因爲我需要在儘可能少的內存中存儲一個非常大的數組。最大的數字是185439173519100986733232011757860,這對uint64來說太大了。實際上,要存儲它的最小位數將是108位,或14個字節(到最近的字節)。因此,爲了適應這些大量引入numpy的,我用下面的兩個功能:
def large_number_to_numpy(number,columns): return tuple((number >> (8*x)) & 255 for x in range(columns-1,-1,-1))
def numpy_to_large_number(numbers): return sum([y << (8*x) for x,y in enumerate(numbers[::-1])])
這是用這樣的:
>>> large_number_to_numpy(185439173519100986733232011757860L,14) (9L, 36L, 146L, 73L, 36L, 146L, 73L, 36L, 146L, 73L, 36L, 146L, 73L, 36L)
numpy_to_large_number((9L, 36L, 146L, 73L, 36L, 146L, 73L, 36L, 146L, 73L, 36L, 146L, 73L, 36L)) 185439173519100986733232011757860L
用這樣的數組創建:
my_array = numpy.zeros(TOTAL_ROWS,','.join(14*['uint8']))
然後填充:
my_array[x] = large_number_to_numpy(large_number,14)
而是我得到這個:
>>> my_array
array([(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1),
(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2),
(9, 36, 146, 73, 36, 146, 73, 36, 146, 73, 36, 146, 73, 34),
(9, 36, 146, 73, 36, 146, 73, 36, 146, 73, 36, 146, 73, 35),
(9, 36, 146, 73, 36, 146, 73, 36, 146, 73, 36, 146, 73, 36)],
dtype=[('f0', 'u1'), ('f1', 'u1'), ('f2', 'u1'), ('f3', 'u1'), ('f4', 'u1'), ('f5', 'u1'), ('f6', 'u1'), ('f7', 'u1'), ('f8', 'u1'), ('f9', 'u1'), ('f10', 'u1'), ('f11', 'u1'), ('f12', 'u1'), ('f13', 'u1')])
>>> numpy.diff(my_array)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.7/site-packages/numpy/lib/function_base.py", line 1567, in diff
return a[slice1]-a[slice2]
TypeError: ufunc 'subtract' did not contain a loop with signature matching types dtype([('f0', 'u1'), ('f1', 'u1'), ('f2', 'u1'), ('f3', 'u1'), ('f4', 'u1'), ('f5', 'u1'), ('f6', 'u1'), ('f7', 'u1'), ('f8', 'u1'), ('f9', 'u1'), ('f10', 'u1'), ('f11', 'u1'), ('f12', 'u1'), ('f13', 'u1')]) dtype([('f0', 'u1'), ('f1', 'u1'), ('f2', 'u1'), ('f3', 'u1'), ('f4', 'u1'), ('f5', 'u1'), ('f6', 'u1'), ('f7', 'u1'), ('f8', 'u1'), ('f9', 'u1'), ('f10', 'u1'), ('f11', 'u1'), ('f12', 'u1'), ('f13', 'u1')]) dtype([('f0', 'u1'), ('f1', 'u1'), ('f2', 'u1'), ('f3', 'u1'), ('f4', 'u1'), ('f5', 'u1'), ('f6', 'u1'), ('f7', 'u1'), ('f8', 'u1'), ('f9', 'u1'), ('f10', 'u1'), ('f11', 'u1'), ('f12', 'u1'), ('f13', 'u1')])
我想問題 是你有複合數據(元組值),沒有定義減法。你爲什麼不使用一個簡單的'uint8'值2d數組?你只需要將定義中的所有'uint8'字符串改爲單個''uint8''。 –
數組行的數據類型不同。我猜python不知道如何減去這樣的數據類型。也許'my_array = int(my_array)'會工作。 – Aguy