假设我们有矩阵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[:]))
但它会失败。
答案 0 :(得分:2)
对于您的特定示例,您可以使用numpy.hstack
和numpy.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]]
我怀疑你可能在想,“这很麻烦,现在U
和V
的形状不同于A
,这不是我想要的”。但是,对此我说,“是的,这是一个麻烦,但最好直接处理问题而不是将其隐藏在数组的无效行中。”
这种方法的标准示例和典型用例是numpy.diff,其中,“输出的形状与 a 相同,除了沿着轴的尺寸小于名词的“。