将浮点数量化为任意数量的 bins 的一般方法?
General way to quantize floating point numbers into arbitrary number of bins?
我想将一系列最大值和最小值分别为 X
和 Y
的数字量化为任意数量的 bin。例如,如果我的数组的最大值是 65535
,最小值是 0
(不要假设这些都是整数)并且我想将这些值量化为 2
个 bin,所有大于 floor(65535/2)
的值将变为 65535
,其余变为 0
。如果我想从 1
到 65535
之间的任何数字量化数组,类似的故事会重复。我想知道,是否有一种有效且简单的方法可以做到这一点?如果不是,对于 2
的幂数,我怎样才能有效地做到这一点?虽然伪代码会很好,但 Python + Numpy 是首选。
这不是最优雅的解决方案,但是:
MIN_VALUE = 0
MAX_VALUE = 65535
NO_BINS = 2
# Create random dataset from [0,65535] interval
numbers = np.random.randint(0,65535+1,100)
# Create bin edges
bins = np.arange(0,65535, (MAX_VALUE-MIN_VALUE)/NO_BINS)
# Get bin values
_, bin_val = np.histogram(numbers, NO_BINS-1, range=(MIN_VALUE, MAX_VALUE))
# Change the values to the bin value
for iter_bin in range(1,NO_BINS+1):
numbers[np.where(digits == iter_bin)] = bin_val[iter_bin-1]
更新
做同样的工作:
import pandas as pd
import numpy as np
# or bin_labels = [i*((MAX_VALUE - MIN_VALUE) / (NO_BINS-1)) for i in range(NO_BINS)]
_, bin_labels = np.histogram(numbers, NO_BINS-1, range=(MIN_VALUE, MAX_VALUE))
pd.cut(numbers, NO_BINS, right=False, labels=bin_labels)
我想将一系列最大值和最小值分别为 X
和 Y
的数字量化为任意数量的 bin。例如,如果我的数组的最大值是 65535
,最小值是 0
(不要假设这些都是整数)并且我想将这些值量化为 2
个 bin,所有大于 floor(65535/2)
的值将变为 65535
,其余变为 0
。如果我想从 1
到 65535
之间的任何数字量化数组,类似的故事会重复。我想知道,是否有一种有效且简单的方法可以做到这一点?如果不是,对于 2
的幂数,我怎样才能有效地做到这一点?虽然伪代码会很好,但 Python + Numpy 是首选。
这不是最优雅的解决方案,但是:
MIN_VALUE = 0
MAX_VALUE = 65535
NO_BINS = 2
# Create random dataset from [0,65535] interval
numbers = np.random.randint(0,65535+1,100)
# Create bin edges
bins = np.arange(0,65535, (MAX_VALUE-MIN_VALUE)/NO_BINS)
# Get bin values
_, bin_val = np.histogram(numbers, NO_BINS-1, range=(MIN_VALUE, MAX_VALUE))
# Change the values to the bin value
for iter_bin in range(1,NO_BINS+1):
numbers[np.where(digits == iter_bin)] = bin_val[iter_bin-1]
更新
做同样的工作:
import pandas as pd
import numpy as np
# or bin_labels = [i*((MAX_VALUE - MIN_VALUE) / (NO_BINS-1)) for i in range(NO_BINS)]
_, bin_labels = np.histogram(numbers, NO_BINS-1, range=(MIN_VALUE, MAX_VALUE))
pd.cut(numbers, NO_BINS, right=False, labels=bin_labels)