pyspark稠密向量(DenseVector)和稀疏向量(SparseVector)

本文详细介绍了PySpark中两种向量类型:稠密向量(DenseVector)和稀疏向量(SparseVector)的创建方法及示例。稠密向量通过Vector.dense()创建,而稀疏向量可通过Vector.sparse()以两种不同方式构建。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

pyspark稠密向量和稀疏向量

pyspark的本地向量有两种:

DenseVctor   :稠密向量   其创建方式   Vector.dense(数据)

SparseVector :稀疏向量   其创建方式有两种:

  方法一:Vector.sparse(向量长度,索引数组,与索引数组所对应的数值数组)

  方法二:Vector.sparse(向量长度,(索引,数值),(索引,数值),(索引,数值),...(索引,数值))

示例:

比如向量(1,0,3,4)的创建有三种方法:

稠密向量:直接Vectors.dense(1,0,3,4)

稀疏向量:

方法一:Vector.sparse(4,(0,2,3),(1,3,4))    

    表示该向量的第0个,第2个,第3个位置,(1,3,4) 表示(0,2,3)位置对应的数值分别为1,3,4

方法二:Vector.sparse(4,(0,1),(2,3),(3,4))

    (0,1)就是(索引,数值)的形式。位置0的数值为1, 位置2的数值为3,位置3的数值为4。

 

扫描下方二维码关注领取程序员必备千套ppt模板,300本精选好书,丰富面经:

有酒有风

 

### 稠密光流法与稀疏光流法的区别 #### 定义差异 稠密光流法稀疏光流法均属于光流方法的一种,其核心目标是通过分析视频序列中连续帧间的像素变化来推断运动信息。然而两者的主要区别在于它们所关注的像素范围不同。 - **稀疏光流**:仅计算图像中特定兴趣点(通常是角点或其他显著特征)的光流向量[^3]。这意味着它只处理少量具有代表性的像素位置,因此能够快速完成运算并适合于实时应用环境。 - **稠密光流**:则针对整个输入图像中的每一个像素都尝试估算对应的移动方向向量[^2]。这使得它可以捕捉到更加全面细致的画面动态细节,不过也因为涉及更多的数据处理而导致运行效率较低。 #### 计算复杂度对比 从计算资源消耗角度来看: - 对于**稀疏光流**,由于只需要追踪少数几个关键点,所以整体耗时较少,在硬件性能有限的情况下仍能保持良好表现; ```python import cv2 cap = cv2.VideoCapture('video.mp4') ret, old_frame = cap.read() old_gray = cv2.cvtColor(old_frame, cv2.COLOR_BGR2GRAY) p0 = cv2.goodFeaturesToTrack(old_gray, mask=None, maxCorners=100, qualityLevel=0.3, minDistance=7) while True: ret, frame = cap.read() if not ret: break frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # Calculate sparse optical flow using Lucas-Kanade method. p1, st, err = cv2.calcOpticalFlowPyrLK(old_gray, frame_gray, p0, None) good_new = p1[st==1] good_old = p0[st==1] for i,(new,old) in enumerate(zip(good_new,good_old)): a,b = new.ravel() c,d = old.ravel() img = cv2.add(frame,cv2.cvtColor(cv2.drawKeypoints(frame_gray.astype(np.uint8),p1,None,color=(0,255,0)),cv2.COLOR_GRAY2BGR)) cv2.imshow('Sparse Optical Flow',img) k = cv2.waitKey(30) & 0xff if k == 27: break old_gray = frame_gray.copy() p0 = good_new.reshape(-1,1,2) ``` - 而对于**稠密光流**而言,因其需遍历整幅画面里的每一处区域来进行位移检测,故所需时间较长且占用更多内存空间;但与此同时也能带来更为精确的结果呈现形式——即每一点都有对应的方向指示箭头或者颜色编码表示速度大小及走向趋势图样等等视觉效果增强手段被广泛应用于科研领域研究物体表面纹理变形过程等方面的研究工作当中去探索未知世界奥秘之旅从未停止脚步前行吧少年们加油哦! ```python import numpy as np import cv2 cap = cv2.VideoCapture('input_video.avi') ret, first_frame = cap.read() prev_gray = cv2.cvtColor(first_frame, cv2.COLOR_BGR2GRAY) hsv_mask = np.zeros_like(first_frame) hsv_mask[..., 1] = 255 while(cap.isOpened()): ret, frame = cap.read() gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # Calculates dense optical flow by Farneback method flow = cv2.calcOpticalFlowFarneback(prev_gray,gray, None, pyr_scale = 0.5, levels = 3, winsize = 15, iterations = 3, poly_n = 5, poly_sigma = 1.2, flags = 0) mag, ang = cv2.cartToPolar(flow[...,0], flow[...,1]) hsv_mask[...,0] = ang*180/np.pi/2 hsv_mask[...,2] = cv2.normalize(mag,None,0,255,cv2.NORM_MINMAX) rgb = cv2.cvtColor(hsv_mask,cv2.COLOR_HSV2BGR) prev_gray = gray cv2.imshow('Dense Optical Flow',rgb) if cv2.waitKey(30) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows() ``` #### 应用场景举例 - 当需要高效地识别某个具体目标物的位置随时间改变轨迹曲线时可以选择采用`稀疏光流技术`,因为它专注于提取那些最有可能发生变化的关键部位作为参考依据进而减少不必要的冗余操作提高工作效率降低成本开支达到事半功倍的效果; - 如果想要获得关于某一区域内所有组成要素各自独立却又相互关联的整体迁移状况全貌描绘的话那么就非常适合运用上文中提到过的那种叫做'密集型光学流动模型'(dense optical flow model). 这种方式虽然耗费较多计算机处理器时间存储容量但是却可以为我们提供更多维度上的定量分析资料帮助深入理解事物本质规律发现潜在价值所在之处.
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值