【问题标题】:How do I group elements of a numpy array by two?如何将 numpy 数组的元素按两个分组?
【发布时间】:2017-09-12 16:26:54
【问题描述】:

我面临以下问题。我有一个np.array,结构如下:

[A, B, C, D, E, F]

A..F 是 numpy 数组,保证大小相同。 我希望达到以下形状:

[ A | B, C | D, E | F ]

其中A | Bnp.hstack([A, B])。我还希望能够将其推广到 hstack 中的任意数量的元素,因为这个数字除以这个数组的长度。

我不确定如何实现 - 可能有一些不错的解决方案,但我的经验并没有引导我到那里。我将不胜感激。

【问题讨论】:

  • 如果a = np.array([[1,2,3,4],[5,6,7,8]]); b = np.array([[11,12,13,14],[21,22,23,24]]); 然后np.hstack([a,b]) 产生:array([[ 1, 2, 3, 4, 11, 12, 13, 14], [ 5, 6, 7, 8, 21, 22, 23, 24]]) 这是你想要的吗?
  • 每个单独数组的输入数组形状到底是什么? [A, B, C, D, E, F] 并没有准确地向我们提供该信息,除非您的意思是:input_arr = np.array([A, B, C, D, E, F])。这是你的吗?
  • 我本可以在帖子中指定我的目的。 A..FPIL 导入的图像,我想将六张(或更多)图像平铺到2x3 网格中并保存为图像
  • 那么,输入是这些图像/数组的列表还是数组?如果是数组,那么每个图像/数组对应的形状又是什么?还是你总是正好有 6 张图片?
  • 数组的形状是(6, 1000, 1000, 4),我想要一个(2000, 3000, 4)的数组

标签: python numpy multidimensional-array


【解决方案1】:

用较小的块组成 NumPy 数组的手动方法是使用 np.blocknp.bmat

h, w, N = 3, 4, 6
A, B, C, D, E, F = [np.full((h,w), i) for i in list('ABCDEF')]
result = np.block([[A, B], [C, D], [E, F]])

产量

array([['A', 'A', 'A', 'A', 'B', 'B', 'B', 'B'],
       ['A', 'A', 'A', 'A', 'B', 'B', 'B', 'B'],
       ['A', 'A', 'A', 'A', 'B', 'B', 'B', 'B'],
       ['C', 'C', 'C', 'C', 'D', 'D', 'D', 'D'],
       ['C', 'C', 'C', 'C', 'D', 'D', 'D', 'D'],
       ['C', 'C', 'C', 'C', 'D', 'D', 'D', 'D'],
       ['E', 'E', 'E', 'E', 'F', 'F', 'F', 'F'],
       ['E', 'E', 'E', 'E', 'F', 'F', 'F', 'F'],
       ['E', 'E', 'E', 'E', 'F', 'F', 'F', 'F']],
      dtype='<U1')

假设块是 2D 数组,重塑 NumPy 块数组的更自动化方法是使用unblockshaped

import numpy as np

def unblockshaped(arr, h, w):
    """
    http://stackoverflow.com/a/16873755/190597 (unutbu)
    Return an array of shape (h, w) where
    h * w = arr.size

    If arr is of shape (n, nrows, ncols), n sublocks of shape (nrows, ncols),
    then the returned array preserves the "physical" layout of the sublocks.
    """
    n, nrows, ncols = arr.shape
    return (arr.reshape(h // nrows, -1, nrows, ncols)
               .swapaxes(1, 2)
               .reshape(h, w))

h, w, N = 3, 4, 6
arr = np.array([np.full((h,w), i) for i in list('ABCDEF')])
result = unblockshaped(arr, h*N//2, w*2)
print(result)

产生相同的结果。


请参阅this question 获取示例 如何将一系列图像排列成网格。

【讨论】:

    【解决方案2】:

    尚不清楚您想要的最终产品是什么。是这样的吗?

    import numpy as np
    
    a = np.array([
        [1, 2, 3], [2, 3, 4], [5, 6, 7], 
        [8, 9, 10], [11, 12, 13], [14, 15, 16]])
    
    def function(a_in, size):
        size_2 = size * a.shape[1]
        if a.shape[0] % size == 0:
            return np.reshape(a, (a.shape[0] // size, size_2))
        raise RuntimeError("Sorry I can't")
    
    
    print("a = {}".format(a))
    print("b(2) = {}".format(function(a, 2)))
    print("b(3) = {}".format(function(a, 3)))
    

    打印出来:

    a = [[ 1  2  3]
     [ 2  3  4]
     [ 5  6  7]
     [ 8  9 10]
     [11 12 13]
     [14 15 16]]
    
    b(2) = [[ 1  2  3  2  3  4]
     [ 5  6  7  8  9 10]
     [11 12 13 14 15 16]]
    
    b(3) = [[ 1  2  3  2  3  4  5  6  7]
     [ 8  9 10 11 12 13 14 15 16]]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-21
      • 2020-12-13
      • 1970-01-01
      • 1970-01-01
      • 2022-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多