Numpy重复一行或一列

时间:2015-05-13 18:22:28

标签: python numpy

假设我们有矩阵A:

A = [1,2,3
     4,5,6
     7,8,9]

我想知道是否有办法获得:

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

以及:

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

这是因为我想要实现的功能如下:

U(i,j) = min(A(i+1,j)^2, A(i,j)^2)
V(i,j) = min(A(i,j+1)^2, A(i,j)^2)

numpy.minimum似乎需要两个形状相同的数组。

我的想法如下:

np.minimum(np.square(A[1:]), np.square(A[:]))

但它会失败。

2 个答案:

答案 0 :(得分:2)

对于您的特定示例,您可以使用numpy.hstacknumpy.vstack

In [11]: np.vstack((A, A[-1]))
Out[11]: 
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9],
       [7, 8, 9]])

In [12]: np.hstack((A, A[:, [-1]]))
Out[12]: 
array([[1, 2, 3, 3],
       [4, 5, 6, 6],
       [7, 8, 9, 9]])

最后一个的替代方法是np.hstack((A, np.atleast_2d(A[:,-1]).T))np.vstack((A.T, A.T[-1])).T):您无法hstack(3,)数组添加到(3,3)个数组将元素放在(3,1)数组的行中。

答案 1 :(得分:2)

@xnx为你的文字问题提供了一个很好的答案,但我想知道你真正需要的是否是别的东西。

这种类型的问题在比较中出现了很多,而通常的解决方案是仅采用有效条目,而不是使用未对齐的比较。也就是说,这样的事情很常见:

import numpy as np

A = np.arange(9).reshape((3,3))

U = np.minimum(A[1:,:]**2, A[:-1,:]**2)
V = np.minimum(A[:,1:]**2, A[:,:-1]**2)

print U
# [[ 0  1  4]
#  [ 9 16 25]]

print V
# [[ 0  1]
#  [ 9 16]
#  [36 49]]

我怀疑你可能在想,“这很麻烦,现在UV的形状不同于A,这不是我想要的”。但是,对此我说,“是的,这是一个麻烦,但最好直接处理问题而不是将其隐藏在数组的无效行中。”

这种方法的标准示例和典型用例是numpy.diff,其中,“输出的形状与 a 相同,除了沿着轴的尺寸小于名词的“。