首页 > 解决方案 > 是否有相当于 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 值,我需要的是,对于我数组中的每个值,函数都会被调用。

标签: pythonpandasnumpy

解决方案


您可以通过将形状传递给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])

推荐阅读