使用numpy

时间:2018-07-12 06:41:12

标签: python numpy indexing histogram

我遇到了一个问题,希望您能帮助我解决。

我有一个2D numpy数组,我想按值将其划分为bin。然后,我需要知道每个bin中所有数字的确切初始索引。

例如,考虑矩阵

    [[1,2,3], [4,5,6], [7,8,9]]

和bin数组

    [0,2,4,6,8,10].

然后,元素第一个元素([0,0])应该存储在一个容器中,接下来的两个元素([0,1],[0,2])应该存储在另一个容器中,依此类推。所需的输出如下所示:

    [[[0,0]],[[0,1],[0,2]],[[1,0],[1,1]],[[1,2],[2,0]],[[2,1],[2,2]]]

即使我尝试了几个numpy函数,也无法以一种优雅的方式做到这一点。最好的尝试可能是

    >>> a = [[1,2,3], [4,5,6], [7,8,9]]
    >>> bins = [0,2,4,6,8,10]
    >>> bin_in_mat = np.digitize(a, bins, right=False)
    >>> bin_in_mat
    array([[1, 2, 2],
           [3, 3, 4],
           [4, 5, 5]])
    >>> indices = np.argwhere(bin_in_mat)
    >>> indices
    array([[0, 0],
           [0, 1],
           [0, 2],
           [1, 0],
           [1, 1],
           [1, 2],
           [2, 0],
           [2, 1],
           [2, 2]])

但这不能解决我的问题。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

您需要离开numpy并为此使用循环-它不能代表您的结果:

bin_in_mat = np.digitize(a, bins, right=False)
bin_contents = [np.argwhere(bin_in_mat == i) for i in range(len(bins))]
>>> for b in bin_contents:
...     print(repr(b))

array([], shape=(0, 2), dtype=int64)
array([[0, 0]], dtype=int64)
array([[0, 1],
       [0, 2]], dtype=int64)
array([[1, 0],
       [1, 1]], dtype=int64)
array([[1, 2],
       [2, 0]], dtype=int64)
array([[2, 1],
       [2, 2]], dtype=int64)

请注意,digitize对于大整数输入(直到1.15)是一个不好的选择,并且比bin_in_mat = np.searchsorted(bins, a, side='left')更快更正确