如何在Python中将每个数组元素替换为4个副本?

5
我该如何使用numpy / python数组例程来完成这个任务?
例如,如果我有数组[[1,2,3,4]],输出应该是
[[1,1,2,2,],
 [1,1,2,2,],
 [3,3,4,4,],
 [3,3,4,4]]

因此,输出的数组大小是原始数组的行和列维度的两倍。并且每个元素从原始数组中重复三次。
我目前所拥有的是这个。
def operation(mat,step=2):
    result = np.array(mat,copy=True)
    result[::2,::2] = mat
    return result

这给我一个数组。
[[ 98.+0.j   0.+0.j  40.+0.j   0.+0.j]
 [  0.+0.j   0.+0.j   0.+0.j   0.+0.j]
 [ 29.+0.j   0.+0.j  54.+0.j   0.+0.j]
 [  0.+0.j   0.+0.j   0.+0.j   0.+0.j]]

对于输入

[[98 40]
 [29 54]]

数组的维度总是偶数。

3个回答

3
使用np.repeat()函数:
In [9]: A = np.array([[1, 2, 3, 4]])
In [10]: np.repeat(np.repeat(A, 2).reshape(2, 4), 2, 0)
Out[10]: 
array([[1, 1, 2, 2],
       [1, 1, 2, 2],
       [3, 3, 4, 4],
       [3, 3, 4, 4]])

说明:

首先,您可以重复数组项:

  In [30]: np.repeat(A, 3)
  Out[30]: array([1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4])

那么您所需要做的就是重塑结果(根据您期望的结果可能会有所不同):
  In [32]: np.repeat(A, 3).reshape(2, 3*2)
  array([[1, 1, 1, 2, 2, 2],
         [3, 3, 3, 4, 4, 4]])

现在你需要沿着第一个轴重复这个结果:

  In [34]: np.repeat(np.repeat(A, 3).reshape(2, 3*2), 3, 0)
  Out[34]: 
  array([[1, 1, 1, 2, 2, 2],
         [1, 1, 1, 2, 2, 2],
         [1, 1, 1, 2, 2, 2],
         [3, 3, 3, 4, 4, 4],
         [3, 3, 3, 4, 4, 4],
         [3, 3, 3, 4, 4, 4]])

你能否添加一些关于参数本身的注释吗?那会很有帮助。 - CyprUS

1

另一种方法可能是使用 np.kron -

np.kron(a.reshape(-1,2),np.ones((2,2),dtype=int))

基本上,我们将输入数组重塑为一个保持第二轴长度为2的2D数组。然后np.kron基本上使用该数组在每个长度为2的行和列上复制元素:np.ones((2,2),dtype=int)
示例运行 -
In [45]: a
Out[45]: array([7, 5, 4, 2, 8, 6])

In [46]: np.kron(a.reshape(-1,2),np.ones((2,2),dtype=int))
Out[46]: 
array([[7, 7, 5, 5],
       [7, 7, 5, 5],
       [4, 4, 2, 2],
       [4, 4, 2, 2],
       [8, 8, 6, 6],
       [8, 8, 6, 6]])

如果您想要有4行,请使用 a.reshape(2,-1)

0
更好的解决方案是使用numpy,但你也可以使用迭代:
a = [[1, 2, 3, 4]]

v = iter(a[0])

b = []
for i in v:
    n = next(v)
    [b.append([i for k in range(2)] + [n for k in range(2)]) for j in range(2)]

print b

>>> [[1, 1, 2, 2], [1, 1, 2, 2], [3, 3, 4, 4], [3, 3, 4, 4]]

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