11.2-转置矩阵解法

作者: BeautifulSoulpy | 来源:发表于2019-08-28 09:04 被阅读0次

如果一个人比你优秀,你尽可以放心交往,因为优秀的人散发正能量!如果一个人有德行,你尽量与他成为一个团队,因为厚德载物!如果一个人有智慧,你尽可安心与他同行,相信智慧能照亮未来!如果一个人活的生命有质量,你可用心与他成为知己,生命才有高度与宽度。

遇到问题,不要盲目的下结论;
每一道题都是我们精心筛选的;

练习2: 给定一个3*3的方阵,求其转置矩阵;

出题意图:给你一个转置矩阵,请你用我们的数据结构(list)来描述它;
最常见的数据结构是列表list

方法1:print打印;可能会被面试官鄙视0分;
不要一上来就用print,面试官可能认为你不会算法;

m = '1 2 3\n4 5 6\n7 8 9'
#print(m)
l_c=len(m.split('\n'))   #3
m=m.split()     #->list[]
l_row=len(m)//l_c   #  3

for i in range(l_row):
    for j in range(l_c):
        print(m[j*3+i],end=' ')
    print('\r')
---------------------------------------------------------------
1 4 7 
2 5 8 
3 6 9 


方法2 :方阵(二维数组)  转换 j !=i 的时候交换 ;

m = [[1,2,3],[4,5,6],[7,8,9]]   #写成二维数组;
for i in range(3):
    for j in range(i):
        m[i][j],m[j][i]=m[j][i],m[i][j]   # 3 维方阵交换3次;   数值为 0 、1、2;
print(m)
-----------------------------
1 4 7 
2 5 8 
3 6 9 

总结:
# for 循坏的几种写法含义理解不深: 
for i in lst:
    for j in lst:

for i in lst;
    for j in i:
        
# 优化方案:
# 1.对角线的取值,是否交换;
# 2.写成data写成 二维数组,否则会绕大湾子;
# 3.数组不建议进行二次索引,二次索引是建立在list中都是单个字符的情况;


方法3: 矩阵的打印;不打印对角线

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

for x in range(len(lst1)):
    for y in range(len(lst1[x])):
        if y>x:   # 除去对角线的打印;
            lst1[x][y],lst1[y][x]=lst1[y][x],lst1[x][y]
lst1
-----------------------------
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]

方法3 enumerate() 函数的使用

enumerate() 函数的使用

enumerate是类似生成器的可迭代对象;
enumerate(sequence, [start=0])
enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。

>>>seasons = ['Spring', 'Summer', 'Fall', 'Winter']
>>>list(enumerate(seasons))
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
>>>list(enumerate(seasons, start=1))       # 小标从 1 开始
[(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]

3.3 # 给定一个不规则矩阵(23)的方阵,求其转置矩阵(有点难为人)*

方法1: enumerate()函数写法;
lst=[[1,2,3],[4,5,6]]

for i,y in enumerate(lst[1],1):
    print(i,y)
-------------------------
1 4
2 5
3 6


方法2:enumerate + append 方法 ;
matrix = [[1,2,3],[4,5,6]]

tm = []
for row in matrix:
    print(row)
    for i, col in enumerate(row):
        if len(tm) < (i+1):   #动态创建;
            tm.append([])
        tm[i].append(col)

print(tm)
----------------------------------------
[1, 2, 3]
[4, 5, 6]
[[1, 4], [2, 5], [3, 6]]


方法3:一此行开辟所有空间+列表解析式;

m = [[1,4],[2,5],[3,6]]
# tm = [[0]*2]*3   # 3*2
tm = [[0 for col in range(len(m))] for row in range(len(m[0]))]  #开辟空间 ;列表解析式 效率更高;
count = 0

for i,row in enumerate(tm):
    for j,col in enumerate(row):
        tm[i][j] = m[j][i]  #将m所有的元素搬到tm中;一次都少不了
        count+ = 1
print(m)
print(tm)
print(count)
----------------------------------------
[[1, 4], [2, 5], [3, 6]]
[[1, 2, 3], [4, 5, 6]]
6

总结:
1. tm = [[0 for col in range(len(m))] for row in range(len(m[0]))]  #开辟空间 ;列表解析式;
2. tm[i][j] = m[j][i]  #将m所有的元素搬到tm中;一次都少不了
3. 不要盲目的下结论:append方法与for循坏迭代快慢比较:可能的原因:数据的规模大小,而不是append比for快;

方法3: append方法

m=[[1,2,3],[4,5,6]]

tm = []
count = 0
for row in m:
    for i,col in enumerate(row):
        if len(tm)<i+1:   # m有i列就要为tm创建i行;
            tm.append([])

        tm[i].append(col)
        count += 1

print(m)
print(tm)
print(count)
------------------------------------------
[[1, 2, 3], [4, 5, 6]]
[[1, 4], [2, 5], [3, 6]]
6

数字统计
3.4 # 随机产生10个数字【10,20】,统计重复的数字有几个;不重复的数字有几个,分别是什么?
#4.随机生成10个数字;统计重复和不重复数字的个数和值;
方法1:list count 实现方法
lst = []
for i in range(10):
    lst.append(random.randint(1,20))

lst1 = []
m = 0
for i in range(10):
    #print(lst[i],lst.count(lst[i]))
    n = lst.count(lst[i])
    if n>1 and lst[i] not in lst1:
        lst1.append(lst[i])
        m += 1
print('重复的数字有{}个,分别为{}'.format(m,lst1))
---------------------------------------------------------------
重复的数字有3个,分别为[14, 2, 13]


解法2:

import random

nums = []
for _ in range(10):    # for循坏的i值可以为任意;包括符号
    nums.append(random.randint(1,20))

print("Origin numbers = {}".format(nums))
print('-----------------------------------')

length = len(nums)
samenums = [] #记录相同的数字;
diffnums = [] #记录不同的数字;
states = [0]*length  #记录不同的索引状态;

for i in range(length):
    flag = False  #假定没有重复;
    if states[i] == 1:
        continue
    for j in range(i+1,length):
        if states[j] == i:
            continue
        if nums[i] == nums[j]:
            flag = True
            states[j] = 1
    if flag: #有重复;
        samenums.append(nums[i])
        states[i] = 1
    else:
        diffnums.append(nums[i])
        
print("Same numbers = {1},Counter={0}".format(len(samenums),samenums))
print("Different numbers = {1},Counter={0}".format(len(diffnums),diffnums))
print(list(zip(states,nums)))
-----------------------------------------------------------------------------------
Origin numbers = [1, 7, 5, 14, 10, 19, 8, 9, 10, 11]
-----------------------------------
Same numbers=[10],Counter=1
Different numbers=[1, 7, 5, 14, 19, 8, 9, 11],Counter=8
[(0, 1), (0, 7), (0, 5), (0, 14), (1, 10), (0, 19), (0, 8), (0, 9), (1, 10), (0, 11)]


总结:
 1. for循坏的i值可以为任意;包括符号;

相关文章

  • 11.2-转置矩阵解法

    如果一个人比你优秀,你尽可以放心交往,因为优秀的人散发正能量!如果一个人有德行,你尽量与他成为一个团队,因为厚德载...

  • 2019-02-22 Day 48 待提高

    1.转置矩阵 给定一个矩阵 A, 返回 A 的转置矩阵。 矩阵的转置是指将矩阵的主对角线翻转,交换矩阵的行索引与列...

  • 机器学习里的数学基础——矩阵论

    1. 基本概念 1.1 向量及其转置 一个维列向量及其转置可记作: 1.2 矩阵及其转置 一个的矩阵及其的转置矩阵...

  • 正交矩阵

    转置矩阵为其逆矩阵。

  • 2019-03-13

    矩阵的转置则称 为A的转置,记为 设为矩阵,则为 矩阵 为对称矩阵,则 为反对称矩阵,则 为n阶方阵,,为对称矩阵...

  • 矩阵

    参考资料转置矩阵伴随矩阵

  • 12、转置矩阵

    1、题目如下: 给定一个矩阵 A, 返回 A 的转置矩阵。 矩阵的转置是指将矩阵的主对角线翻转,交换矩阵的行索引与...

  • leetcode-数组篇-转置数组(867)

    题目 给定一个矩阵 A, 返回 A 的转置矩阵。 矩阵的转置是指将矩阵的主对角线翻转,交换矩阵的行索引与列索引。 ...

  • LeetCode 867. 转置矩阵

    题目 给定一个矩阵 A, 返回 A 的转置矩阵。 矩阵的转置是指将矩阵的主对角线翻转,交换矩阵的行索引与列索引。 ...

  • 转置矩阵

    题目: 题目的理解: 创建一个二维数组,保存交换行索引和列索引后的值。 python实现 提交 // END 多动...

网友评论

    本文标题:11.2-转置矩阵解法

    本文链接:https://www.haomeiwen.com/subject/blguectx.html