【问题标题】:How to create a matrix based on bins?如何创建基于 bin 的矩阵?
【发布时间】:2017-09-28 14:13:01
【问题描述】:

我有一组 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 数组,对于给定的元组 [1],每个 bin 的范围为 -1 和 +1 整数,3 的倍数范围为 3- 27(但这应该可以与整数和范围的任何其他组合互换)。最后,我希望能够创建一个看起来像这样的矩阵:

[[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)。但后来我迷路了。谁能指导我?

【问题讨论】:

    标签: python arrays numpy bins


    【解决方案1】:

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

    【讨论】:

    • 完美答案!谢谢!!
    猜你喜欢
    • 2021-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-19
    • 2020-10-06
    • 2010-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多