使用 numpy bincount 和二维数组的权重

问题描述 投票:0回答:3

假设我有以下 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
>>>

并出现错误

python numpy
3个回答
2
投票

不,这是不可能的。一个提示是,没有任何

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.]])

1
投票

您可以使用

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]])

0
投票

我刚刚将二维空间转换为线性空间并转换回来(在第一次数字化尺寸之后,就像在 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))
© www.soinside.com 2019 - 2024. All rights reserved.