有没有可能用numpy替换循环,但不包括在modu中的函数

2024-09-30 03:23:29 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

你可以猜到,最后一排不起作用,但如果有这样的事情,我会非常感激,我设法找到它<;3

我的目标是找到比for循环更好的东西。 提前谢谢!你知道吗


Tags: and函数字符串import目的numpy元素len
1条回答
网友
1楼 · 发布于 2024-09-30 03:23:29

您可以使用^{}方法,并将其应用于内置的len函数:

vect_len = np.vectorize(len)

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

请注意,这将摆脱显式循环,但实现仍然是一个隐藏的循环。如文件所述:

The vectorize function is provided primarily for convenience, not for performance. The implementation is essentially a for loop.

您还可以使用^{}来获得相同的结果,并且在大型数组上可能会看到更好的性能(但可读性较差):

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]

相关问题 更多 >

    热门问题