是否可以用numpy BUT替换该模块中不包含的功能的循环

时间:2018-09-27 20:05:28

标签: python numpy

此问题用于python。例如,如果我有一个数组,其中的元素是字符串。我可以使用len()函数打印出每个元素的长度吗?

import numpy as np
arr = np.array(["qwerty", "uiop", "as"])
# and here is the actual example
arr.len()

您可能猜到那最后一行不起作用,但是如果有这样的事情,我真的很感激,我设法找到了它<3

我的目标是找到比for循环更好的东西。 预先谢谢你!

1 个答案:

答案 0 :(得分:0)

您可以使用np.vectorize方法,并将其应用于内置的len函数:

vect_len = np.vectorize(len)

>>> vect_len(arr)
array([6, 4, 2])

请注意,这摆脱了您的显式循环,但是实现仍然是幕后的循环。如文档所述:

  

提供矢量化功能主要是为了方便,而不是为了提高性能。实现本质上是一个for循环。

您也可以使用np.frompyfunc来获得相同的效果,并且在大型数组上可能会看到更好的性能(但可读性较差):

vect_len2 = np.frompyfunc(len, 1, 1)

>>> vect_len2(arr)
array([6, 4, 2], dtype=object)

在大型数据帧上测试性能

import timeit

arr = np.random.choice(arr,1000000)

vect_len = np.vectorize(len)
vect_len2 = np.frompyfunc(len, 1, 1)

def using_vectorize(arr=arr):
    return vect_len(arr)

def using_frompyfunc(arr=arr):
    return vect_len2(arr)


>>> timeit.timeit(using_vectorize,number=10)/10
0.17760197920142673
>>> timeit.timeit(using_frompyfunc,number=10)/10
0.11580852449988015

frompyfunc往往会做得更好,但是您只会在大型数组上看到明显的差异

老实说,一个好的旧列表理解可以替代小型数组(尽管您说过不希望循环):

>>> [len(i) for i in arr]
[6, 4, 2]