如何将numpy数组的元素分组为两个?

时间:2017-09-12 16:26:54

标签: python numpy multidimensional-array

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

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

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

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

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

我不确定如何实现这一点 - 可能有一些不错的解决方案,但我的经验并没有把我带到那里。我很欣赏一些见解。

2 个答案:

答案 0 :(得分:2)

从较小的块中组合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 如何将一系列图像排列成网格。

答案 1 :(得分:0)

目前还不完全清楚您想要的最终产品是什么。这是这样的吗?

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]]