У меня есть метод для вокселизации большого набора данных, который создает двоичное значение (12 байтов) для всех уникальных вокселей, затем я могу взять подмножество, используя df.isin()
для запроса.
Я использовал pandas.Series.unique()
в качестве входных данных для этого запроса, но получал странные результаты, поэтому попытался np.unique()
, и это сработало.Мой вопрос, почему я получаю разные результаты?
import pandas as pd
import numpy as np
import struct
def voxel(tmp):
binarize = lambda x: struct.pack('i', int((x * 100) / 5))
tmp.loc[:, 'xb'] = tmp.x.apply(binarize)
tmp.loc[:, 'yb'] = tmp.y.apply(binarize)
tmp.loc[:, 'zb'] = tmp.z.apply(binarize)
tmp.loc[:, 'B'] = tmp.xb + tmp.yb + tmp.zb
return tmp
X, Y, Z = np.meshgrid(np.arange(0, 100),
np.arange(0, 100),
np.arange(0, 100))
grid = pd.DataFrame(data=np.vstack([X.flatten(), Y.flatten(), Z.flatten()]).T,
columns=['x', 'y', 'z'])
grid = voxel(grid)
print 'numpy:', len(np.unique(grid.B)), 'pandas:', len(grid.B.unique())
, который производит
numpy:100000 pandas:99
Я проверил это, используя Pandas 0.23.0 с Python 2.7.14 на RHEL 7.5.1804 и намой MacBook