前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Numpy中的索引与排序

Numpy中的索引与排序

作者头像
用户3577892
发布于 2020-06-12 08:34:27
发布于 2020-06-12 08:34:27
2.6K00
代码可运行
举报
文章被收录于专栏:数据科学CLUB数据科学CLUB
运行总次数:0
代码可运行

花哨的索引探索花哨的索引组合索引Example:选择随机点利用花哨索引修改值数组排序Numpy中的快速排序:np.sort,np.argsort部分排序:分割

花哨的索引

花哨的索引和前面那些简单的索引非常类似, 但是传递的是索引数组, 而不是单个标量。花哨的索引让我们能够快速获得并修改复杂的数组值的子数据集。

探索花哨的索引

花哨的索引在概念上非常简单, 它意味着传递一个索引数组来一次性获得多个数组元素。例如以下数组:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import numpy as np
rand = np.random.RandomState()

x = rand.randint(, size=)
print(x)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[         ]
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 获得三个不同元素,可以用以下方式实现
[x[], x[], x[]]
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[, , ]
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 另一种方法是传递索引的单个列表或数组来获得同样的结果
ind = [, , ]
x[ind]
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
array([, , ])
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 数组的形状与索引数组的形状一样,与被索引数组形状不需要一样
ind = np.array([[, ],
                [, ]])
x[ind]
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
array([[71, 86],
       [60, 20]])
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 花哨索引也适用于多维度数组
X = np.arange().reshape((, ))
X
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
row = np.array([, , ])
col = np.array([, , ])
X[row, col]
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
array([ ,  , ])

这里需要注意, 结果的第一个值是 X[0, 2], 第二个值是 X[1, 1], 第三个值是 X[2, 3]。在花哨的索引中, 索引值的配对遵循广播的规则。因此当我们将一个列向量和一个行向量组合在一个索引中时, 会得到一个二维的结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
X[row[:, np.newaxis], col]
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
array([[ 2,  1,  3],
       [ 6,  5,  7],
       [10,  9, 11]])
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
row[:, np.newaxis] * col
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
array([[0, 0, 0],
       [2, 1, 3],
       [4, 2, 6]])

组合索引

花哨的索引可以和其他索引方案结合起来形成更强大的索引操作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(X)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[[       ]
 [       ]
 [     ]]
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 花哨索引和普通索引组合使用
X[, [, , ]]
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
array([,  ,  ])
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 花哨索引和切片组合使用
X[:, [, , ]]
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
array([[ 6,  4,  5],
       [10,  8,  9]])
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 花哨索引和掩码组合使用
mask = np.array([, , , ], dtype=bool)
X[row[:, np.newaxis], mask]
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
array([[ 0,  2],
       [ 4,  6],
       [ 8, 10]])

Example:选择随机点

  • 这种方法常用于分割数据集
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 以下是二维正态分布组成的数组
mean = [, ]
cov = [[, ],
       [, ]]
X = rand.multivariate_normal(mean, cov, )
X.shape
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(100, 2)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 可视化
%matplotlib inline
import matplotlib.pyplot as plt
import seaborn; seaborn.set()  # for plot styling

plt.scatter(X[:, ], X[:, ]);
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 利用花哨索引随机选择20个不重复的索引值
indices = np.random.choice(X.shape[], , replace=False)
indices
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
array([, , , , , , , , , , , , , , , ,  ,
       , ,  ])
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
selection = X[indices]  
selection.shape
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(20, 2)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
plt.scatter(X[:, ], X[:, ], alpha=0.3)
plt.scatter(selection[:, ], selection[:, ],
            facecolor='none', s=);

利用花哨索引修改值

正如花哨的索引可以被用于获取部分数组, 它也可以被用于修改部分数组。例如, 假设我们有一个索引数组, 并且希望设置数组中对应的值:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
x = np.arange()
i = np.array([, , , ])
x[i] = 
print(x)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[               ]
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 可以使用任何赋值语句
x[i] -= 
print(x)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[               ]
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 操作中重复出现的索引会导致出乎意料的结果产生
x = np.zeros()
x[[, ]] = [, ]
print(x)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[6. 0. 0. 0. 0. 0. 0. 0. 0. 0.]

这个操作首先将x[0]=4,然后赋值x[0]=6

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 下面的结果和你想象的一样吗?思考下为什么
i = [, , , , , ]
x[i] += 
x
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
array([6., 0., 1., 1., 1., 0., 0., 0., 0., 0.])

你可能期望 x[3] 的值为 2, x[4] 的值为 3, 因为这是这些索引值重复的次数。但是为什么结果不同于我们的预想呢?从概念的角度理解, 这是因为 x[i] += 1 是 x[i] = x[i] + 1 的简写。x[i] + 1 计算后,这个结果被赋值给了 x 相应的索引值。记住这个原理后, 我们却发现数组并没有发生多次累加, 而是发生了赋值, 显然这不是我们希望的结果。

因此, 如果你希望累加, 该怎么做呢?你可以借助通用函数中的 at()方法来实现。进行如下操作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
x = np.zeros()
np.add.at(x, i, )
print(x)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[0. 1. 1. 0. 1. 0. 0. 0. 1. 0.]

at() 函数在这里对给定的操作、 给定的索引(这里是 i) 以及给定的值(这里是 1) 执行的是就地操作。另一个可以实现该功能的类似方法是通用函数中的 reduceat() 函数, 你可以在 NumPy 文档中找到关于该函数的更多信息。

数组排序

例如, 一个简单的选择排序重复寻找列表中的最小值, 并且不断交换直到列表是有序的。可以在 Python 中仅用几行代码来实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 用Python代码实现选择排序
import numpy as np

def selection_sort(x):
    for i in range(len(x)):
        swap = i + np.argmin(x[i:])
        (x[i], x[swap]) = (x[swap], x[i])
    return x
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
x = np.array([, , , , ])
selection_sort(x)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
array([, , , , ])

Numpy中的快速排序:np.sort,np.argsort

默认情况下, np.sort 的排序算法是 快速排序, 其算法复杂度为[N log N], 另外也可以选择归并排序和堆排序。对于大多数应用场景, 默认的快速排序已经足够高效了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
x = np.array([, , , , ])
np.sort(x)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
array([, , , , ])
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 可以使用排好序的数组代替原数组
x.sort()
print(x)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[    ]
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# np.argsort返回的是原来数组排好序的索引值
x = np.array([, , , , ])
i = np.argsort(x)
print(i)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[    ]
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 通过花哨索引创建有序数组
x[i]
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
array([, , , , ])

沿着行或列排序

通过axis参数,沿着多维数组的行或列进行排序,这种操作将会丢失行或列值之间的关系

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
rand = np.random.RandomState()
X = rand.randint(, , (, ))
print(X)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[[     ]
 [     ]
 [     ]
 [     ]]
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 对每一列进行排序
np.sort(X, axis=)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
array([[2, 1, 4, 0, 1, 5],
       [5, 2, 5, 4, 3, 7],
       [6, 3, 7, 4, 6, 7],
       [7, 6, 7, 4, 9, 9]])
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 对每一行进行排序
np.sort(X, axis=)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
array([[3, 4, 6, 6, 7, 9],
       [2, 3, 4, 6, 7, 7],
       [1, 2, 4, 5, 7, 7],
       [0, 1, 4, 5, 5, 9]])

部分排序:分割

np.partition输入的是数组和数字K,输出结果是一个新数组,新数组最左边排列的是K个最小的值,往右是任意顺序的其他值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
x = np.array([, , , , , , ])
np.partition(x, )
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
array([, , , , , , ])

请注意, 结果数组中前三个值是数组中最小的三个值, 剩下的位置是原始数组剩下的值。在这两个分隔区间中, 元素都是任意排列的。 与排序类似, 也可以沿着多维数组任意的轴进行分隔:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 与排序类似也可以沿着多维数组的任意轴进行分割
np.partition(X, , axis=)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据科学CLUB 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
如何使用Gau针对任意指定域名执行URL收集任务
Gau是一款功能强大的URL收集工具,该工具可以针对任意指定的域名,从AlienVault的开放威胁交换器、Wayback Machine、Common Crawl平台和URLScan收集并爬取已知的URL地址。
FB客服
2024/06/25
3490
如何使用Gau针对任意指定域名执行URL收集任务
SQLiDetector:一款功能强大的SQL注入漏洞检测工具
 关于SQLiDetector  SQLiDetector是一款功能强大的SQL注入漏洞检测工具,该工具支持BurpBouty配置文件,可以帮助广大研究人员通过发送多个请求(包含14种Payload)并检查不同数据库的152个正则表达式模式来检测基于错误的SQL注入漏洞。  功能介绍  该工具的主要目标是帮助研究人员通过使用不同的Payload来扫描基于错误的SQL注入漏洞,例如: '123''123`123")123"))123`)123`))123'))123')123"123[]123""123
FB客服
2023/03/29
2.7K0
SQLiDetector:一款功能强大的SQL注入漏洞检测工具
从开源工具中汲取知识之网页爬虫工具
今天分析了几款网站爬虫开源工具,其主要作用是辅助安全测试人员,测试网站功能,发现网站漏洞,本着学习的原则,通过阅读源码的方式来学习其核心技术,从而有助于我们自身编写相关脚本,在实际的工作中应用它来提升工具效率。
信安之路
2022/05/23
1K0
awesome-bugbounty-builder 查找漏洞的所有常用工具
image.png 安装: $ git clone https://github.com/0xJin/awesome-bugbounty-builder.git $ cd awesome-bugbounty-builder/ $ chmod +x awesome-bugbounty-builder.sh $ ./awesome-bugbounty-builder.sh 工具你会在这里找到 Amass Sublister Gauplus HTTPX Gf + patterns Kxss Sqlmap Co
Khan安全团队
2022/01/02
9230
不会写代码也能实现赏金自动化
最近一直在研究自动化漏洞发现的技术,github 也有非常多优秀的集成工具,本着学习研究的心态,对这些工具进行了学习,今天来分享其中的一个,通过 bash 脚本将各种工具集成到一起,实现无需自己实现相关功能也能自动化漏洞发现。项目地址:
信安之路
2022/05/23
1.3K0
不会写代码也能实现赏金自动化
如何使用SSRFire自动扫描和发现SSRF漏洞
SSRFire是一款针对SSRF漏洞的自动化漏洞挖掘工具,在该工具的帮助下,广大研究人员只需要给该工具提供一个目标域名和服务器信息,SSRFire将帮助我们自动挖掘出潜在的SSRF漏洞。除此之外,该工具还可以挖掘XSS以及开放重定向等安全漏洞,功能算是十分强大了。
FB客服
2022/04/11
1.7K0
如何使用SSRFire自动扫描和发现SSRF漏洞
老外的漏洞赏金猎人顶级侦察工具
在本博客中,我们探讨了为漏洞赏金猎人提供支持的顶级侦察工具。从Shodan的IoT设备洞察到Waymore的Web应用程序漏洞识别,该工具库中的每个工具在保护数字环境方面都发挥着至关重要的作用。加入我们的网络侦察之旅,这些工具是揭开安全系统秘密的关键。
潇湘信安
2024/03/22
6600
老外的漏洞赏金猎人顶级侦察工具
如何防御Java中的SQL注入
SQL注入是应用程序遭受的最常见的攻击类型之一。鉴于其常见性及潜在的破坏性,需要在了解原理的基础上探讨如何保护应用程序免受其害。
云鲨RASP
2023/05/29
7450
如何使用ParamSpider在Web文档中搜索敏感参数
ParamSpider是一款功能强大的Web参数挖掘工具,广大研究人员可以利用ParamSpider来从Web文档的最深处挖掘出目标参数。
FB客服
2020/09/14
4K0
如何使用ParamSpider在Web文档中搜索敏感参数
针对一些简单场景的模糊测试
WFuzz 是开源的一款针对 web 应用模糊测试的开源软件,使用 Python 编写,测试的漏洞类型主要包括:未授权访问、注入漏洞(目录遍历、SQL 注入、XSS、XXE)、暴力破解登录口令 等。项目地址:
信安之路
2021/07/06
9390
Burp Suite安全SQL注入测试
http://example.com?id=1 AND 1=CAST((SELECT version()) AS NCHAR(100))
徐攀棒
2025/03/27
3380
神兵利器 - ReconFTW 漏洞扫描
ReconFTW是一种工具,旨在通过运行最佳工具集来执行扫描和查找漏洞,从而对目标域执行自动侦查。
Khan安全团队
2021/03/10
1.7K0
国外大佬的信息收集(侦查)过程
文章提示;这篇文章很不错,从国外机翻过来的,我十分建议你去看原文,因为机翻,真的对有些意思出现偏差,有点难受,如果想快速学习,看本篇机翻的还是可以的。对于其中工具的选择,国内国外其实还是有着一些差异,但是思路确实不错。
天钧
2023/03/08
1.7K0
国外大佬的信息收集(侦查)过程
如何使用ReconFTW来实现完整的渗透测试信息侦察
ReconFTW是一个简单且功能强大的脚本,ReconFTW能够通过各种技术实现子域名枚举的自动化,并进一步扫描其中可能存在的安全漏洞。扫描完成之后,ReconFTW将给广大研究人员报告潜在的安全漏洞。
FB客服
2021/03/09
1.7K0
如何使用ReconFTW来实现完整的渗透测试信息侦察
SQL注入工具之SQLmap入门操作
虽然没有官方的图形化界面,但是市面上有很多个人做的图形化插件,如果实在不熟悉命令行可以考虑换成图形化插件进行使用。
测试小兵
2024/01/26
2.9K0
SQL注入工具之SQLmap入门操作
如何使用Arsenal快速部署功能强大的Bug Bounty工具
Arsenal是一个功能强大且使用简单的Shell脚本(Bash),该工具专为漏洞赏金猎人设计,在该工具的帮助下,我们可以轻松在自己环境中安装并部署目前社区中功能最为强大的网络侦查工具、漏洞扫描工具和其他安全研究工具。与此同时,该工具还可以完成相关依赖组件的自动化安装,并将所有安全工具存储在本地设备上。
FB客服
2022/11/14
9700
如何使用Arsenal快速部署功能强大的Bug Bounty工具
SQLiv:一款批量SQL注入漏洞扫描工具
今天给大家介绍一款名叫SQLiv的批量SQL注入漏洞扫描工具。 功能介绍 批量域名扫描SQL注入漏洞; 扫描指定域名(带爬虫功能); 反向域名扫描; SQL注入漏洞扫描以及域名信息检测都是采用多进程方式进行的,所以脚本的运行速度会非常快,并能够同时扫描多个URL地址。 工具的安装与运行 用户可以使用下列命令安装和运行SQLiv: git clonehttps://github.com/Hadesy2k/sqlivulscan.git sudo python2 setup.py -i 依赖组件 bs4
FB客服
2018/02/27
5K0
SQLiv:一款批量SQL注入漏洞扫描工具
攻防|红队外网打点实战案例分享
由于传播、利用本公众号亿人安全所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号亿人安全及作者不为此承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除并致歉。谢谢!
亿人安全
2023/12/15
9780
攻防|红队外网打点实战案例分享
MegPlus:一款功能强大的自动化网络侦查任务执行框架
 关于MegPlus  MegPlus是一款功能强大的自动化网络侦查任务执行框架,该工具可以帮助广大研究人员以自动化的形式执行多种网络侦查任务。该工具支持针对某个目标执行常见问题扫描并生成详细的分析报告。除此之外,该工具还具备一定的渗透测试功能。 值得一提的是,该工具还允许我们一次性扫描HackerOne上的所有范围内目标,而这个过程MegPlus仅使用GraphQL即可实现。  支持扫描的内容  MegPlus支持扫描下列内容: 1、使用Sublist3r扫描子域名; 2、配置文件; 3、其他有价值的数据
FB客服
2023/05/12
2850
MegPlus:一款功能强大的自动化网络侦查任务执行框架
WebCopilot:一款功能强大的子域名枚举和安全漏洞扫描工具
WebCopilot是一款功能强大的子域名枚举和安全漏洞扫描工具,该工具能够枚举目标域名下的子域名,并使用不同的开源工具检测目标存在的安全漏洞。
FB客服
2024/04/01
6750
WebCopilot:一款功能强大的子域名枚举和安全漏洞扫描工具
推荐阅读
相关推荐
如何使用Gau针对任意指定域名执行URL收集任务
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档