pandas的DataFrame的apply函数可以实现对指定的轴进行遍历操作,这是个很方便也很常用的函数,但是问题在于,当我们的数据量较大,比如有50万行,这时要对50万行进行逐行遍历的话,如果对每行的操作用到了Series索引,那么这将是一个非常耗时的过程,因为对于pandas来说,索引操作是低效的,这种低效再经过50万行放大,那么性能就会显得很差。对此,我们可以通过numpy的apply_along_axis函数替代,可以实现一样的功能,但是由于numpy的ndarray的索引相对更加高效,所以性能上会有很大的提升。

import pandas as pd
import numpy as np
df=pd.DataFrame(np.arange(800000).reshape(200000,4),columns=list('abcd'))
t1=time.time()
s1=df.apply(lambda x:x['a']+x['d'],axis=1)
t2=time.time()
print(t2-t1)
arr=df.values
t3=time.time()
s=np.apply_along_axis(lambda x:x[0]+x[3],axis=1,arr=arr)
t4=time.time()
print(t4-t3)
# output:
# 9.685098886489868
# 1.3745567798614502

可以看到,性能提升了7倍多,如果数据量更大,性能提升会更加的明显。

对于apply_along_axis函数的使用,相比于DataFrame的apply函数,有以下几点需要特别注意:

1、apply_along_axis本质上还是一个for loop,只是其数据结构上性能会更佳,所以整体的速度会更快;

2、如果ndarray的数据类型是object,那么在使用apply_along_axis时,其会进一步的将object转为numpy的其他数据类型,因此这时就需要特别注意,特别注意第一个inner loop遇到的元素,之后将以此元素在numpy中的数据类型为准进行转换,这可能会引起数据类型不兼容的问题,会抛出异常或者产生数据误差,具体可看笔者的这篇 文章

3、axis参数只能接受一个int值,因为默认func参数中关于arr的输入只能是一个一维的array。

4、ndarray在形式上区别于DataFrame的重要的一点是,前者只有数字索引,而后者有标签索引,很多时候,标签索引给了相应的列或者行以明确的含义,这是很重要的,在脚本逻辑上有时也是必要的;那么如何在ndarray中也实现标签索引呢?我们只需要额外的构建一个字典,即关于标签和整数之间的映射,这样我们可以通过这个字典作为标签到数字的中转站,从而实现在ndarray中也有标签索引。

5、如果需要对多条轴进行同一个函数的操作,可以利用numpy.apply_over_axis,其axis参数可以指定多轴,其运算过程为:现在第一个传入的轴上做运算,得到结果后再在第二个轴上对第一步得到的结果做相同的函数操作,以此类推,返回结果。

pandas的DataFrame的apply函数可以实现对指定的轴进行遍历操作,这是个很方便也很常用的函数,但是问题在于,当我们的数据量较大,比如有50万行,这时要对50万行进行逐行遍历的话,如果对每行的操作用到了Series索引,那么这将是一个非常耗时的过程,因为对于pandas来说,索引操作是低效的,这种低效再经过50万行放大,那么性能就会显得很差。对此,我们可以通过numpy的... 在 numpy 中合并两个array numpy 中可以通过concatenate,参数 axis =0表示在垂直方向上合并两个数组,等价于np.vstack;参数 axis =1表示在水平方向上合并两个数组,等价于np.hstack。 垂直方向: np.concatenate([arr1,arr2], axis =0) np.vstack([arr1,arr2]) 水平方向: np.concatenate([arr1,arr2], axis =1) np.hstack([arr1,arr2]) import numpy as np import pandas as pd arr1=np.ones((3 numpy . apply _a long _ axis (func, axis , arr, *args, **kwargs) 2.作用: 将arr数组的每一个元素经过func 函数 变换形成的一个新数组 3.参数介绍: 其中func, axis ,arr是必选的 func是我们写的一个 函数 axis 表示 函数 func对arr是作用于行还是列 arr便是我们要进行操作的数组了 可选参数:*args, **k... [ 1., 1., 1., 1., 1.], [ 1., 1., 1., 1., 1.]]) arr2=np.random.randn(15).reshape(arr1.shape) Out[8]: array([[-0.09666 在基本数据管理部分,主要是涉及到如何新建数据集,并且对数据集中的变量和观测值进行提取和操作。基本上用到了如下 函数 ,可以根据 函数 名回忆一下用法: import pandas as pd import numpy as np from pandas import Series, DataFrame pd.r...
这个 函数 的各个参数的含义请大家自行查阅了解,这里只记录一下参数 axis 的作用。 首先定义一个 函数 来打印数组的shape与内容,然后生成一个4x3的数组array: def print_a(array): print("shape: %s, array is \n%s"%(array.shape, array)) array=np.array([[2,3,4],[3,4,5],[6,7,8],[7,8,9]]) 对这个数组调用np. apply _a long _ axis 函数 ,看该 函数 会对数组产生什么作用
numpy . apply _a long _ axis (func, axis ,arr,*args,**kwargs): 必选参数:func, axis ,arr。其中func是我们自定义的一个 函数 函数 func(arr)中的arr是一个数组, 函数 的主要功能就是对数组里的每一个元素进行变换,得到目标的结果。 其中 axis 表示 函数 func对数组arr作用的轴。 可选参数...
X_train = train.drop("label", axis =1) y_train = train["label"] X_test = test.drop("label", axis =1) y_test = test["label"] # 创建逻辑斯蒂模型并训练 model = LogisticRegression() model.fit(X_train, y_train) # 评估模型 accuracy = model.score(X_test, y_test) print("Accuracy: {:.2f}%".format(accuracy * 100)) 这个例子中,我们首先读取了一个名为 "data.csv" 的数据文件,然后将其划分为训练集和测试集。接下来,我们选择了除了 "label" 列以外的所有列作为特征,并将 "label" 列作为标签。最后,我们创建了一个逻辑斯蒂模型,并将其训练。评估模型时,我们使用了模型的 `score` 方法,并打印出了准确率。