我正在尝试使用numpy中的arpgpartition,但似乎出了点问题,我似乎无法弄清楚。这是正在发生的事情:
这些是排序数组的前5个元素 norms
np.sort(norms)[:5]
array([ 53.64759445, 54.91434479, 60.11617279, 64.09630585, 64.75318909], dtype=float32)
但是当我使用 indices_sorted = np.argpartition(norms, 5)[:5]
norms[indices_sorted]
array([ 60.11617279, 64.09630585, 53.64759445, 54.91434479, 64.75318909], dtype=float32)
当我认为应该得到与排序数组相同的结果时?
当我使用3作为参数时,它可以正常工作 indices_sorted = np.argpartition(norms, 3)[:3]
norms[indices_sorted]
array([ 53.64759445, 54.91434479, 60.11617279], dtype=float32)
这对我来说没有多大意义,希望有人可以提供一些见解?
编辑:重新解释这个问题,因为argpartition是否保留k个分区元素的顺序更有意义。
我们需要使用按排序顺序保留的索引列表,而不是将第k个参数作为标量输入。因此,要保持第一个5
元素的排序性质np.argpartition(a,5)[:5]
,只需执行-
np.argpartition(a,range(5))[:5]
这里是一个示例,目的是为了使事情更清楚:
In [84]: a = np.random.rand(10)
In [85]: a
Out[85]:
array([ 0.85017222, 0.19406266, 0.7879974 , 0.40444978, 0.46057793,
0.51428578, 0.03419694, 0.47708 , 0.73924536, 0.14437159])
In [86]: a[np.argpartition(a,5)[:5]]
Out[86]: array([ 0.19406266, 0.14437159, 0.03419694, 0.40444978, 0.46057793])
In [87]: a[np.argpartition(a,range(5))[:5]]
Out[87]: array([ 0.03419694, 0.14437159, 0.19406266, 0.40444978, 0.46057793])
请注意,这argpartition
在性能方面是有意义的,如果我们希望获取一小部分元素的排序索引,那么可以说元素k
数占元素总数的一小部分。
让我们使用一个更大的数据集,并尝试获取所有元素的排序索引,以使上述要点更清楚:
In [51]: a = np.random.rand(10000)*100
In [52]: %timeit np.argpartition(a,range(a.size-1))[:5]
10 loops, best of 3: 105 ms per loop
In [53]: %timeit a.argsort()
1000 loops, best of 3: 893 µs per loop
因此,要对所有元素进行排序np.argpartition
并不是要走的路。
现在,假设我想只获取具有该大数据集的前5个元素的排序索引,并保持这些元素的顺序-
In [68]: a = np.random.rand(10000)*100
In [69]: np.argpartition(a,range(5))[:5]
Out[69]: array([1647, 942, 2167, 1371, 2571])
In [70]: a.argsort()[:5]
Out[70]: array([1647, 942, 2167, 1371, 2571])
In [71]: %timeit np.argpartition(a,range(5))[:5]
10000 loops, best of 3: 112 µs per loop
In [72]: %timeit a.argsort()[:5]
1000 loops, best of 3: 888 µs per loop
在这里非常有用!
为什么我在输出中得到一个额外的1*1,这有点倒退?有点像递归初学者,希望得到详细的答案。 输出
问题内容: 对于没有JS经验的人,您对学习Node.js有什么建议? 我在论坛上阅读了很多有关事件驱动,非阻塞,异步,回调等内容的信息,但我不知道那是什么! 在哪里可以学习基础知识,以便理解所有术语以及将来的node.js? 谢谢! 问题答案: 您提到的概念(事件驱动,非阻塞,异步,回调)不是特定于JavaScript的,在更一般的上下文中理解它们非常有价值。它们都围绕着优雅地处理我们无法控制的资
问题:给定一个整数数组,返回两个数字的索引,使它们相加到一个特定的目标。 您可以假设每个输入都有一个精确的解决方案,并且您可以不使用相同的元素两次。 例子: 给定nums=[2,7,11,15],target=9, 因为Nums[0]Nums[1]=2 7=9,返回[0,1]。 使用for循环后,我无法理解这些步骤。我是Python新手,请有人帮助我。
每次我运行< code>pip时,都会出现以下警告。 警告:旧脚本包装程序正在调用pip。这将在未来版本的pip中失败。请看https://github.com/pypa/pip/issues/5599寻求解决潜在问题的建议。为了避免这个问题,您可以使用“-m pip”调用Python,而不是直接运行pip。 请帮我理解一下。Pip警告 编辑1。我尝试重新安装pip,但警告仍然存在。此外,我还附上
我正在创建简单的Spring Bootweb应用程序,我正在使用spring初始化器生成的项目 我已经在路径中设置了我的JDK和maven也为JAVA_HOME完成了设置 以下是我在项目中的POM
在维基百科中,背包的算法如下: 我在网上找到的所有例子的结构都是一样的<我无法理解的是,这段代码是如何考虑到最大值可能来自较小的背包这一事实的?E、 如果背包容量为8,那么最大值可能来自容量7(8-1)<我找不到任何逻辑来考虑最大值可能来自较小的背包。这是错误的想法吗?