我面临以下问题。我有np.array
,具有以下结构:
[A, B, C, D, E, F]
其中A..F
是numpy数组,保证大小相同。
我希望达到以下形状:
[ A | B, C | D, E | F ]
其中A | B
为np.hstack([A, B])
。我还希望能够将它概括为hstack
中的任意数量的元素,因为这个数字除了这个数组的长度。
我不确定如何实现这一点 - 可能有一些不错的解决方案,但我的经验并没有把我带到那里。我很欣赏一些见解。
答案 0 :(得分:2)
从较小的块中组合NumPy数组的手动方法是使用np.block
或np.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]]