python - 是否有相当于 pandas.apply 的 numpy?
问题描述
我有一个电话,它为熊猫系列添加了一些随机值:
series = series.apply(lambda x: int(math.ceil(x + x * rand_value(range))))
出于性能原因,我不能再使用 pandas.Series 而是必须使用 numpy 数组。
想象一下我的一维数组数据存储在a
,我将如何将调用从上面转换为 numpy?我读过np.vectorize
但我不明白如何将它与我的 lambda 和自制函数一起使用来调用。
我的想法:
func = np.vectorize(lambda x: int(math.ceil(x + x * rand_value(range))))
a = func(a)
乍一看,这两个调用似乎产生了相同的输出,但我不确定。你能证实这一点吗?
还有比使用更好的方法np.vectorize()
吗?
编辑: rand_value(range) 定义如下:
def rand_value(range):
# create value between [-1; 1)
rand = np.random.rand()*2.0 - 1.0;
rand = (rand * float(range)) / 100.0
return rand
所以我不能使用np.ceil
,因为这样我的函数只会被调用一次(?)并且总是具有相同的 rand 值,我需要的是,对于我数组中的每个值,函数都会被调用。
解决方案
您可以通过将形状传递给np.random.rand()
. 一旦你的随机值与输入数组一样多,你就可以使用普通的 numpy 函数
import numpy as np
def rand_value(range, shape=None):
if shape is None:
shape = tuple()
rand = np.random.rand(*shape) * 2.0 - 1.0
rand = rand * range / 100.0
return rand
data = np.arange(16)
# array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15])
rand_value(100.0, shape=data.shape)
# array([-0.0083601 , 0.90346962, -0.70813122, -0.73467017, 0.87514163,
# -0.29496392, 0.63828971, -0.10086984, -0.60248423, 0.26550601,
# -0.17577315, -0.95178997, 0.64123385, -0.54732105, 0.28590572,
# 0.19727859])
np.ceil(data + data * rand_value(100.0, shape=data.shape)).astype(int)
# array([ 0, 1, 4, 6, 8, 4, 9, 3, 4, 17, 10, 18, 16, 12, 16, 30])
推荐阅读
- java - leetcode 24 成对交换节点。一个意想不到的错误错误!(错误 - 在 ListNode 中找到循环)使用语言 Java
- python - Selenium 单击“下一步”不检索下一页
- reactjs - setCount(prev => prev + 1) 和 setCount(count + 1) 有什么区别?
- cakephp - CakePdf 在 php5.6 服务器上
- javascript - 当 Svelte 应用程序侦听时,服务器无限期挂起
- python - 在 R 中为一维数据运行 CNN 时出错
- steganography - 在 Binwalk 中提取未知文件类型,例如 .pyc 文件
- c# - SSMS 登录成功,但无法从 C# 连接
- jenkins - Jira-Trigger 插件未使用 JQL 过滤器触发 jenkins 作业
- flutter - Flutter & AlertDialog :如何将其与底部对齐?我如何制作像这张照片一样的 2 个警报对话框?