假设我有以下 1d numpy 数组
>>> x = np.array([1,2,3,4,5,6])
>>> y = np.array([10,20,30,40,50,60])
和垃圾箱
>>> bins = np.array([0,0,1,1,2,3])
然后我可以对每个数组使用 bincount,例如:
>>> np.bincount(bins, weights=x)
array([ 3., 7., 5., 6.])
>>> np.bincount(bins, weights=y)
array([ 30., 70., 50., 60.])
我可以同时进行两项摘要吗?我试过了
>>> np.bincount(np.array([[0,0,1,1,2,3], [0,0,1,1,2,3]]), weights=np.array([[1,2,3,4,5,6], [10,20,30,40,50,60]]))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: object too deep for desired array
>>>
并出现错误
不,这是不可能的。一个提示是,没有任何
axis
参数可以传递给 bincounts
。你最好的选择是一次做一个:
bc = np.array([np.bincount(bins, weights=x), np.bincount(bins, weights=y)])
或者使用列表理解:
bc = np.array([np.bincount(bins, weights=w) for w in [x, y]])
输出:
>>> bc
array([[ 3., 7., 5., 6.],
[30., 70., 50., 60.]])
np.add.at
模拟 bincount:
xy = np.stack([x,y])
n = np.unique(bins).size
out = np.zeros((2,n), dtype=xy.dtype)
np.add.at(out, (slice(None), bins), xy)
在
out
中输出:
array([[ 3, 7, 5, 6],
[30, 70, 50, 60]])
我刚刚将二维空间转换为线性空间并转换回来(在第一次数字化尺寸之后,就像在 bincount 之前一样)。这虽然效率不高,但也可能有帮助:
x,y 是 bin 值的数组。 x_bins、y_bins 是最大 bin 计数,权重是与 bincount 相同的权重。
def bincount_2d(x, y, *, x_bins, y_bins, weights=None):
linear_bin_count = x_bins * y_bins
linear_bins = x * y_bins + y
linearized_result = np.bincount(linear_bins, minlength=linear_bin_count, weights=weights)
return linearized_result.reshape((x_bins, y_bins))