Python中通过重复矩阵副本来调整矩阵大小

3
假设你有两个矩阵,A是2x2的,B是2x7的(2行,7列)。我想创建一个形状为2x7的矩阵C,由A的副本组成。问题是np.hstack只能理解列数能够被整除的情况(比如2和8),因此你可以轻松地堆叠4个A来得到C,但如果不能整除呢?有什么好的想法吗?
A = [[0,1]      B = [[1,2,3,4,5,6,7],   C = [[0,1,0,1,0,1,0],
     [2,3]]          [1,2,3,4,5,6,7]]        [2,3,2,3,2,3,2]]

请在回复中附上您已经编写的代码。 - Tagc
添加了示例案例。 - Qubix
3个回答

4
这里有一种使用模运算的方法——
In [23]: ncols = 7 # No. of cols in output array

In [24]: A[:,np.mod(np.arange(ncols),A.shape[1])]
Out[24]: 
array([[0, 1, 0, 1, 0, 1, 0],
       [2, 3, 2, 3, 2, 3, 2]])

或者使用%运算符 -

In [27]: A[:,np.arange(ncols)%A.shape[1]]
Out[27]: 
array([[0, 1, 0, 1, 0, 1, 0],
       [2, 3, 2, 3, 2, 3, 2]])

对于这样重复的索引,使用 np.take 会更高效。
In [29]: np.take(A, np.arange(ncols)%A.shape[1], axis=1)
Out[29]: 
array([[0, 1, 0, 1, 0, 1, 0],
       [2, 3, 2, 3, 2, 3, 2]])

0

第一个解决方案非常好。另一种可能的方法是仍然使用hstack,但如果您不想完全重复模式,则可以使用数组切片来获取所需的值:

a.shape > (2,2)

b.shape > (2,7)

repeats = np.int(np.ceil(b.shape[1]/a.shape[0]))

trim = b.shape[1] % a.shape[0]

c = np.hstack([a] * repeats)[:,:-trim]

>

array([[0, 1, 0, 1, 0, 1, 0],
       [2, 3, 2, 3, 2, 3, 2]])

0
一种不使用numpy的解决方案(尽管上面发布的np解决方案更好):
A = [[0,1],
     [2,3]]

B = [[1,2,3,4,5,6,7],
     [1,2,3,4,5,6,7]]

i_max, j_max = len(A), len(A[0])
C = []
for i, line_b in enumerate(B):
    line_c = [A[i % i_max][j % j_max] for j, _ in enumerate(line_b)]
    C.append(line_c)

print(C)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接