螺旋矩阵:给定一个 m*n要素的矩阵。按照螺旋顺序,返回该矩阵的所有要素
其实就是先输出一行或者一列,再删除相应的行或者列
参考文章:http://blog.csdn.net/baoqian1993/article/details/51725140
http://www.cnblogs.com/flyinghearts/archive/2010/12/23/1915329.html
import numpy as np
output=[]
def func_output(arrary,k):
if k==0:
output.extend(list(arrary[0,:]))
arrary=np.delete(arrary,0,0)
if k==1:
output.extend(list(arrary[:,-1]))
arrary=np.delete(arrary,-1,1)
if k==2:
output.extend(reversed(list(arrary[-1,:])))
arrary=np.delete(arrary,-1,0)
else :output.extend(reversed(list(arrary[:,0])))
arrary=np.delete(arrary,0,1)
return array
arry=np.arrary[[1, 2, 3 ,4],[5,6,7,8],[9,10,11,12]]
i=0
while arry.size:
i=i%4
arry=func_output(arry,i)
i=i+1
else:
print(output)
输出结果#[1, 2, 3, 4, 8, 12, 11, 10, 9, 5, 6, 7]
numpy中删除某些行的方法
newarray=delete(array,obg,axis)
对array的操作不是inplace的,对array不改变,只是返回删除后的值,切记!!
obg是所要删除的行或列
axis是要删除的维度,0表示行,1表示列(对于二维数组来说)
另一种通用的方法,以螺旋矩阵的方式访问任意的m*n矩阵
最先访问的是位于m*n最外层的矩阵,第二次访问的是(m-2)*(n-2)矩阵,依次类推,访问到最后可能剩下1*k或者K*1个元素,此时需要单独讨论
对于访问第i个矩阵,i=(0,1,2....),从点(i,i),——>(i,n-i-1)——》(m-i-1,n-i-1)——>(m-i-1,i),
可以用下面几个循环依次访问各边的元素
def func_output(array, m,n):
if m>n:
small=n #列
else:
small=m #行
count=small//2
for i in range(0,count,1):
C=n-1-i
R=m-1-i
for j in range(i,C,1):
output.append(array[i][j])
for j in range(i,R,1):
output.append(array[j][C])
for j in range(C,i,-1):
output.append(array[R][j])
for j in range(R,i,-1):
output.append(array[j][i])
要注意对最终可能剩下的1 * k 或 k * 1矩阵再做个特殊处理。
if (small & 1):
i=count
if(m<=n):
for j in range(i,n-1,1):
output.append(array[i][j])
else:
for j in range(i,m-1,1):
output.append(array[j][i])
return output