我有一种方法来对大型数据集进行体素化,该方法为所有唯一体素创建一个二进制值(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
我已经在RHEL 7.5.1804和MacBook上使用带有Python 2.7.14的Pandas 0.23.0对此进行了测试