【发布时间】:2019-07-04 04:46:55
【问题描述】:
考虑以下函数:
import numpy
import scipy.stats
def return_category(values, categories):
n = len(categories)
result = numpy.empty(values.shape, dtype='U25')
boundaries = scipy.stats.norm.ppf(numpy.arange(0, n+1, 1)/n)
for i, category in enumerate(categories):
a, b = boundaries[i], boundaries[i + 1]
numpy.putmask(result, (values < b) & (values >= a), category)
return result
print(return_category(numpy.array([0.1, -100, 100, 0.44]), ['a', 'b', 'c']))
# ['b' 'a' 'c' 'c']
即它根据值的位置从类别列表中分配一个类别,这样如果values 来自正态分布 (0, 1),则每个类别的概率均等。
问题是:我如何向量化它?即如何摆脱需要大量更改(对于大量类别和值)的循环。
这个问题可以更一般地表述为:有一个映射M={I1: c1, I2: c2, ...},其中Ii是一个区间,所有区间的并集是]-inf,inf[,它们的交集是空的,ci是一个类别.给定一个值数组[a1, a2, ..., aM],创建一个新数组
[
M[Ii such that a1 in Ii],
M[Ii such that a2 in Ii],
...
M[Ii such that aM in Ii],
]
在上述特定情况下,间隔为scipy.stats.norm.ppf(numpy.arange(0, n+1, 1)/n)
【问题讨论】: