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` 方法,并打印出了准确率。