2

我有一组 3-27 的值,有 20 个有限值:

A = [(0,21),(1,12),(2,15),(3,3),(4,21),(5,15),(6,27),(7,21),(8,9),(9,27),(10,12),(11,9),(12,12),(13,3),(14,9),(15,12),(16,6),(17,3),(18,9),(19,15)]

我想学习如何创建一个包含 9 个 bin 的 numpy 数组,每个 bin 的范围为给定元组 [1] 的 -1 和 +1 整数,3-27 范围内的 3 的倍数(但这应该可以与整数和范围的任何其他组合互换)。最后,我希望能够创建一个看起来像这样的矩阵:

[[0,0,0,0,0,0,1,0,0],
 [0,0,0,1,0,0,0,0,0],
 [0,0,0,0,1,0,0,0,0],
 [1,0,0,0,0,0,0,0,0],
 [0,0,0,0,0,0,1,0,0],
 [0,0,0,0,1,0,0,0,0],
 [0,0,0,0,0,0,0,0,1],
 ....]

我正在阅读关于 numpy 的内容,(num, bins) = histogram(x, bins=None, range=None)但我不太确定如何去做。

我在想我必须遍历'A'以获得唯一值('a'),然后按(a-1,a + 1)进行范围,以获得我想要的箱数len(unique_values)。但后来我迷路了。谁能指导我?

4

1 回答 1

2

这是使用np.searchsorted/ np.digitize-的一种方式

bins = np.arange(3,28,3)
ar = np.asarray(A)[:,1] # or np.array([i[1] for i in A])
ids = np.searchsorted(bins, ar) # or np.digitize(ar,bins)-1
out = (ids[:,None] == np.arange(9)).astype(int)

获得最终输出的最后一步可以用数组初始化代替 -

out = np.zeros((len(ids), 9),dtype=int)
out[np.arange(len(ids)), ids] = 1

如果元组中的第一个元素不是按顺序排列的,我们可能希望使用它们来索引行 -

out[np.asarray(A)[:,0], ids] = 1

样品运行 -

In [205]: A
Out[205]: 
[(0, 21),
 (1, 12),
 (2, 15),
 (3, 3),
 (4, 21),
 (5, 15),
 (6, 27),
 (7, 21),
 (8, 9),
 (9, 27),
 (10, 12),
 (11, 9),
 (12, 12),
 (13, 3),
 (14, 9),
 (15, 12),
 (16, 6),
 (17, 3),
 (18, 9),
 (19, 15)]

In [206]: out[:7] # first 7 rows of output
Out[206]: 
array([[0, 0, 0, 0, 0, 0, 1, 0, 0],
       [0, 0, 0, 1, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 1, 0, 0, 0, 0],
       [1, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 1, 0, 0],
       [0, 0, 0, 0, 1, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 1]])
于 2017-09-28T14:23:11.137 回答