提问人:Sterling Butters 提问时间:11/28/2016 更新时间:11/28/2016 访问量:25640
python 中的矩阵镜像
Matrix Mirroring in python
问:
我有一个数字矩阵:
[[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。提前感谢您的任何帮助!
答:
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')
评论