当数组是字符串时,为什么np.unique(array.tolist())比np.unique(数组)更快,而浮点数则相反?

时间:2016-12-27 21:19:25

标签: python numpy

考虑下面的数组和测试结果 当数组元素是字符串时为什么运行tolist()更快,而当数组元素是浮点数时更快?

bunch_of_strings = pd.DataFrame(
    np.random.choice(list(ascii_letters), (10000, 4))).sum(1).values
bunch_of_floats = np.random.rand(10000)

enter image description here

1 个答案:

答案 0 :(得分:6)

你的bunch_of_strings数组有对象dtype,这意味着它没有NumPy带来的任何好处。它基本上只是一个更糟糕的列表,其中包含一堆特定于NumPy的开销和固定大小。

当您致电tolist时,np.unique必须将列表转换回数组。如果是这样,它会生成一个dtype dtype('S4')数组,一个字符串dtype。非对象dtype的好处可以在np.unique调用中节省大量时间,而不是在额外转换中丢失。

相比之下,bunch_of_floats有float64 dtype,而array-> list->数组转换并没有改变它。这只是浪费时间。