python 中的矩阵镜像

Matrix Mirroring in python

提问人:Sterling Butters 提问时间:11/28/2016 更新时间:11/28/2016 访问量:25640

问:

我有一个数字矩阵:

[[a, b, c] 
 [d, e, f] 
 [g, h, i]]

我希望得到相应的镜像:

[[g, h, i]
 [d, e, f]
 [a, b, c] 
 [d, e, f] 
 [g, h, i]]

然后再次屈服:

[[i, h, g, h, i]
 [f, e, d, e, f]
 [c, b, a, b, c] 
 [f, e, d, e, f] 
 [i, h, g, h, i]]

我想坚持使用基本的 Python 包,例如 numpy。提前感谢您的任何帮助!

数组 python-3.x numpy 矩阵

评论

0赞 Selcuk 11/28/2016
有很多方法可以做到这一点,到目前为止你尝试了什么?
0赞 Batman 11/28/2016
列表推导式是你的朋友。

答:

1赞 hpaulj 11/28/2016 #1

这是标记的,所以我假设你的矩阵是一个二维数组numpy

In [937]: A=np.arange(9).reshape(3,3)
In [938]: A
Out[938]: 
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])

在行上翻转它:

In [939]: A[::-1,:]
Out[939]: 
array([[6, 7, 8],
       [3, 4, 5],
       [0, 1, 2]])

垂直连接

In [940]: np.concatenate((A[::-1,:],A), axis=0)
Out[940]: 
array([[6, 7, 8],
       [3, 4, 5],
       [0, 1, 2],
       [0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])

删除重复的第一行

In [941]: np.concatenate((A[::-1,:],A[1:,:]), axis=0)
Out[941]: 
array([[6, 7, 8],
       [3, 4, 5],
       [0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])

你认为你可以用水平(列)反转和连接(axis=1)做同样的事情吗?

11赞 mgilson 11/28/2016 #2

这可以使用纯 python 中的简单辅助函数来实现:

def mirror(seq):
    output = list(seq[::-1])
    output.extend(seq[1:])
    return output

inputs = [
   ['a', 'b', 'c'],
   ['d', 'e', 'f'],
   ['g', 'h', 'i'],
]
print(mirror([mirror(sublist) for sublist in inputs]))

显然,一旦创建了镜像列表,您就可以使用它来创建一个 numpy 数组或其他任何东西......

1赞 kaveh 11/28/2016 #3

这是一个非 numpy 解决方案:

a = [['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i']]
b = list(reversed(a[1:])) + a # vertical mirror
c = list(zip(*b)) # transpose
d = list(reversed(c[1:])) + c # another vertical mirror
e = list(zip(*d)) # transpose again
1赞 Rufflewind 11/28/2016 #4

假设你有

from numpy import array, concatenate
m = array([[1, 2, 3],
           [4, 5, 6],
           [7, 8, 9]])

您可以沿第一个(垂直)轴反转它,通过

>>> m[::-1, ...]
array([[7, 8, 9],
       [4, 5, 6],
       [1, 2, 3]])

其中,按 的步长从最后一行到第一行选择。::-1-1

要省略最后一行,请明确要求选择在以下之前停止:0

>>> m[:0:-1, ...]
array([[7, 8, 9],
       [4, 5, 6]])

然后可以沿第一个轴连接起来

p = concatenate([m[:0:-1, ...], m], axis=0)

形成:

>>> p
array([[7, 8, 9],
       [4, 5, 6],
       [1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

这也可以沿另一个轴重复:

q = concatenate([p[..., :0:-1], p], axis=1)

屈服

>>> q
array([[9, 8, 7, 8, 9],
       [6, 5, 4, 5, 6],
       [3, 2, 1, 2, 3],
       [6, 5, 4, 5, 6],
       [9, 8, 7, 8, 9]])
3赞 backtrack 11/28/2016 #5
import numpy as np

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

A = np.asanyarray(X)
B= np.flipud(A)
C= np.concatenate((B, A[1:]), axis=0)
D = C[:,1:]
F = np.fliplr(C)
E = np.concatenate((F, D), axis=1)

print(E)

我添加了逐步转换。Flipud 和 Flipud 参考

输出

[[9 8 7 8 9]
 [6 5 4 5 6]
 [3 2 1 2 3]
 [6 5 4 5 6]
 [9 8 7 8 9]]
0赞 Ben 11/28/2016 #6
m = [['a', 'b', 'c'], 
     ['d', 'e', 'f'], 
     ['g', 'h', 'i']]

m_m = [[m[abs(i)][abs(j)] 
      for j in range(-len(m)+1, len(m))] 
      for i in range(-len(m)+1, len(m))]

或者使用 numpy

m = array([['a', 'b', 'c'], 
           ['d', 'e', 'f'], 
           ['g', 'h', 'i']])

m_m = m.T[meshgrid(*2*[abs(arange(-len(m) + 1, len(m)))])]
6赞 Daniel F 11/28/2016 #7

numpy.lib.pad'reflect'

m = [['a', 'b', 'c'], 
     ['d', 'e', 'f'], 
     ['g', 'h', 'i']]

n=np.lib.pad(m,((2,0),(2,0)),'reflect')

n
Out[8]: 
array([['i', 'h', 'g', 'h', 'i'],
       ['f', 'e', 'd', 'e', 'f'],
       ['c', 'b', 'a', 'b', 'c'],
       ['f', 'e', 'd', 'e', 'f'],
       ['i', 'h', 'g', 'h', 'i']], 
      dtype='<U1')

评论

1赞 Ahmed Fasih 11/30/2019
请参阅 np.pad 上的 Numpy 文档,了解 和 以及许多其他非常有趣和有用的模式!reflectsymmetricwrap