【问题标题】:Most efficient way to replace all values in a 2D integer numpy array with a three-element sub-array?用三元素子数组替换 2D 整数 numpy 数组中所有值的最有效方法?
【发布时间】:2020-10-14 19:55:32
【问题描述】:

我有一个包含整数值的大型 2D (N x N) numpy 数组。我想从中创建一个 3D 数组,即 (N x N x 3),其中 - 实际上 - 原始数组中的每个整数都被一个包含 RGB 三元组的三元素数组替换,基于特定的映射从整数到 RGB 三元组。

作为一个缩小的例子,考虑输入数组

ints = np.array([[0, 1, 0, 2, 2],
                 [1, 1, 0, 2, 0],
                 [0, 0, 3, 0, 4],
                 [5, 0, 3, 0, 4],
                 [0, 3, 3, 0, 0]])

以及从整数到由指定的 RGB 颜色的映射

mapping = {0: [0, 0, 0],
           1: [255, 0, 0],
           2: [0, 255, 0],
           3: [0, 0, 255],
           4: [127, 127, 0],
           5: [127, 0, 127],
           6: [0, 127, 127]}

我想要一种高效(最好是易于阅读)的方法,它可以采用 intsmapping 并生成输出数组

colors = np.array([[[0,0,0], [255,0,0], [0,0,0], [0,255,0], [0,255,0],],
                  [[255,0,0], [255,0,0], [0,0,0], [0,255,0], [0,0,0],],
                  [[0,0,0], [0,0,0], [0,0,255], [0,0,0], [127,127,0],],
                  [[127,0,127], [0,0,0], [0,0,255], [0,0,0], [127,127,0],],
                  [[0,0,0], [0,0,255], [0,0,255], [0,0,0], [0,0,0],]])

我知道我可以将 colors 分配为适当维度的空 3D 数组,然后循环遍历 ints 的行和列,并相应地设置 colors 的相关切片......但这看起来很棒- 效率低下,我的真实数组将更像 1000 x 1000。有人对更快、更优雅、更惯用的方法有建议吗?

(仅供参考,我的动机是使用 plotly 的 imshow 方法来创建矩阵的可视化,就像热图一样,但是对于不同的数字具有最佳的不同颜色,而不是像标准着色选项假设的任何类型的连续体。 )

【问题讨论】:

    标签: python numpy numpy-ndarray


    【解决方案1】:

    由于您的映射键可以是整数,映射可以与索引相同,RGB 值可以只是 Nx3 数组。

    类似这样的:

    x =  np.arange(30).reshape((10,3))  # the map
    
    keys = np.array([1, 4, 7, 3])
    
    x[keys] # the mapping
    
    # which gives
    array([[ 3,  4,  5],
           [12, 13, 14],
           [21, 22, 23],
           [ 9, 10, 11]])
    

    【讨论】:

    • 有趣...我刚刚尝试使用keys 的二维数组,它似乎有效!
    【解决方案2】:

    制作一个 (7,3) 数组

    arr = np.array(list(mapping.values()))
    

    索引它

    arr[idx,:]
    

    这取决于mapping 是否有序和完整。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-27
      • 2021-07-04
      • 2014-09-30
      相关资源
      最近更新 更多