当前位置: 首页 > 面试题库 >

将点分配到垃圾箱

罗安宁
2023-03-14
问题内容

将数值归入一定范围的一种好方法是什么?例如,假设我有一个值列表,我想按它们的范围将它们分为N个箱。现在,我做这样的事情:

from scipy import *
num_bins = 3 # number of bins to use
values = # some array of integers...
min_val = min(values) - 1
max_val = max(values) + 1
my_bins = linspace(min_val, max_val, num_bins)
# assign point to my bins
for v in values:
  best_bin = min_index(abs(my_bins - v))

其中min_index返回最小值的索引。这个想法是,您可以通过查看与之具有最小差异的箱来找到该点所在的箱。

但是我认为这有一些奇怪的情况。我要寻找的是一种很好的垃圾箱表示形式,理想情况下是半封闭半开的垃圾箱(这样就无法将一个点分配给两个垃圾箱),即

bin1 = [x1, x2)
bin2 = [x2, x3)
bin3 = [x3, x4)
etc...

使用numpy / scipy在Python中执行此操作的好方法是什么?我在这里只关心合并整数值。

非常感谢您的帮助。


问题答案:

numpy.histogram() 正是您想要的。

函数签名为:

numpy.histogram(a, bins=10, range=None, normed=False, weights=None, new=None)

我们对a和最感兴趣binsa是需要合并的输入数据。
bins可以是多个num_bins容器(您的),也可以是标量序列,表示容器边缘(半开)。

import numpy
values = numpy.arange(10, dtype=int)
bins = numpy.arange(-1, 11)
freq, bins = numpy.histogram(values, bins)
# freq is now [0 1 1 1 1 1 1 1 1 1 1]
# bins is unchanged

引用文档:

除了最后一个(最右边)的垃圾箱外,其他所有垃圾箱都是半开的。换句话说,如果bins为:

[1, 2, 3, 4]

那么第一个bin是[1, 2)(包括1,但不包括2),第二个是[2, 3)。但是,最后一个bin是[3, 4],其中 包括 4。

编辑
:您想知道每个元素箱中的索引。为此,您可以使用numpy.digitize()。如果您的垃圾桶将成为一体,则也可以使用numpy.bincount()

>>> values = numpy.random.randint(0, 20, 10)
>>> values
array([17, 14,  9,  7,  6,  9, 19,  4,  2, 19])
>>> bins = numpy.linspace(-1, 21, 23)
>>> bins
array([ -1.,   0.,   1.,   2.,   3.,   4.,   5.,   6.,   7.,   8.,   9.,
        10.,  11.,  12.,  13.,  14.,  15.,  16.,  17.,  18.,  19.,  20.,
        21.])
>>> pos = numpy.digitize(values, bins)
>>> pos
array([19, 16, 11,  9,  8, 11, 21,  6,  4, 21])

由于间隔是在上限处打开的,因此索引是正确的:

>>> (bins[pos-1] == values).all()
True
>>> import sys
>>> for n in range(len(values)):
...     sys.stdout.write("%g <= %g < %g\n"
...             %(bins[pos[n]-1], values[n], bins[pos[n]]))
17 <= 17 < 18
14 <= 14 < 15
9 <= 9 < 10
7 <= 7 < 8
6 <= 6 < 7
9 <= 9 < 10
19 <= 19 < 20
4 <= 4 < 5
2 <= 2 < 3
19 <= 19 < 20


 类似资料:
  • 垃圾回收 我们对生产中花了很多时间来调整垃圾回收。垃圾回收的关注点与Java大致相似,尽管一些惯用的Scala代码比起惯用的Java代码会容易产生更多(短暂的)垃圾——函数式风格的副产品。Hotspot的分代垃圾收集通常使这不成问题,因为短暂的(short-lived)垃圾在大多情形下会被有效的释放掉。 在谈GC调优话题前,先看看这个Attila的报告,它阐述了我们在GC方面的一些经验。 Scal

  • 对于开发者来说,JavaScript 的内存管理是自动的、无形的。我们创建的原始值、对象、函数……这一切都会占用内存。 当我们不再需要某个东西时会发生什么?JavaScript 引擎如何发现它并清理它? 可达性(Reachability) JavaScript 中主要的内存管理概念是 可达性。 简而言之,“可达”值是那些以某种方式可访问或可用的值。它们一定是存储在内存中的。 这里列出固有的可达值的

  • Kubernetes 垃圾收集器的角色是删除指定的对象,这些对象曾经有但以后不再拥有 Owner 了。 注意:垃圾收集是 beta 特性,在 Kubernetes 1.4 及以上版本默认启用。 Owner 和 Dependent 一些 Kubernetes 对象是其它一些的 Owner。例如,一个 ReplicaSet 是一组 Pod 的 Owner。具有 Owner 的对象被称为是 Owner

  • 垃圾收集,引用计数,显式分配 和所有的现代语言一样,OCaml提供垃圾收集器,所以你不用像C/C++一样显式地分配和释放内存。 JWZ在他的文章 "Java sucks" rant(Java蛋疼(怒)!): 第一个好家伙是Java没有 free()。其他的都没有所谓了。这几乎掩盖了所有的缺点,不管有多糟糕, 这个有点让后续文档基本都没有意义了,但是...(译注:但是啥大家自己看吧) OCaml的垃

  • 问题内容: 我正在为Android应用程序实现缓存机制。 我使用,就像发现的许多示例一样。问题是,当我向上或向下滚动时, 大多数 图像已被清除。我在LogCat中看到,每次应用程序加载新图像时,我的应用程序都会被垃圾回收。这意味着中的 大多数 不可见图像都消失了。 因此,每次我 滚动回到 较早的位置(之前我确实下载过图像)时,都必须再次下载图像-它们 不会被 缓存 。 我也研究了这个话题。根据Ma

  • 问题内容: 在Java中分配未使用的对象引用是否可以以任何可衡量的方式改善垃圾回收过程? 我在Java(和C#)方面的经验告诉我,尝试使虚拟机或JIT编译器胜过智能通常是反直观的,但是我看到同事使用此方法,我很好奇这是否是一个好的选择或其中一种巫术编程迷信? 问题答案: 通常没有。 但是像所有事物一样:这取决于。如今,Java中的GC非常好,应在无法访问所有内容后不久对其进行清理。这只是在为局部变

  • 问题内容: 有人可以解释一下G1垃圾收集器的工作原理吗?我还无法在任何地方找到任何全面,易于理解的描述。 谢谢 问题答案: 收集器将堆分成固定大小的区域,并跟踪这些区域中的实时数据。它将一组指针(“记住的集”)保留在区域内和区域外。当认为有必要使用GC时,它将首先收集实时数据较少的区域(因此,“垃圾优先”)。通常,这意味着一步就可以收集整个区域:如果进入一个区域的指针数量为零,则无需对该区域进行标

  • 我正试图设置一个小型Spark集群进行测试。该集群由3名工人和一名师傅组成。我在每个节点上设置了Java、scala和Spark。配置文件如下:spark-defaults.conf: Spark-env.sh