我遇到了一个问题,希望您能帮助我解决。
我有一个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]])
但这不能解决我的问题。有什么建议吗?
答案 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')
更快更正确