python学习2

螺旋矩阵:给定一个 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





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值