首页 > 解决方案 > 是否可以用 numpy BUT 替换该模块中未包含的功能的循环

问题描述

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

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

你可以猜到最后一行不起作用,但如果有类似的东西我会非常感激并且我设法找到它<3

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

标签: pythonnumpy

解决方案


您可以使用该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]

推荐阅读