python - 是否可以用 numpy BUT 替换该模块中未包含的功能的循环
问题描述
这个问题是出于python目的。例如,如果我有一个元素是字符串的数组。我可以用 len() 函数打印出每个元素的长度吗?
import numpy as np
arr = np.array(["qwerty", "uiop", "as"])
# and here is the actual example
arr.len()
你可以猜到最后一行不起作用,但如果有类似的东西我会非常感激并且我设法找到它<3
我的目标是找到比 for 循环更好的东西。先感谢您!
解决方案
您可以使用该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]
推荐阅读
- shopify - Shopify 自定义费用复选框
- axios - 有没有办法检测 nextjs 中所有页面的服务器端 cookie?
- azure - 为什么我的文件上传丢失/删除?Azure 应用服务
- node.js - supertest 将新的 ObjectId 作为字符串传递
- javascript - 连接数组并返回具有最长重复字符的子字符串
- r - 错误:执行嵌套在 while 循环内的 if 语句时,“}”中出现意外的“}”
- ios - 为什么我的程序化屏幕截图捕捉到过时的视图?
- python - 我需要帮助在 python 中做这个双重求和
- powerbi - 我正在尝试创建一个矩阵来比较 CY 和 PY
- amazon-web-services - 任何 SSL 证书都适用于节点