首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据用户输入的矩阵在指定条件下创建新矩阵

根据用户输入的矩阵在指定条件下创建新矩阵
EN

Stack Overflow用户
提问于 2020-12-12 22:31:06
回答 2查看 35关注 0票数 0

作为python的新手,我遇到了一项难以完成的任务。考虑到用户输入的原始矩阵,我应该创建一个新矩阵,其中每个元素对应于大于或等于原始矩阵中相应元素的相邻元素的数量。由于英语不是我的母语,我可能没有正确地介绍它,所以这里有一个例子:

代码语言:javascript
复制
input:
3x3 matrix
9 14 13
3 0  7
8 15 15

output:
3x3 matrix
2 5 2
1 0 1 
2 5 3

因此,如果不清楚,新矩阵将确定有多少相邻元素大于或等于原始矩阵中的一个元素。9大于3& 0,所以结果是"2",14大于所有相邻的,所以它打印出"5",依此类推……当然,它也考虑了对角线。

到目前为止,我已经得到了原始矩阵的输入,但我不确定如何继续下去。我不是那种可以接触到大学资料、教授或同伴帮助的人,到目前为止,我的实验和在线搜索都是徒劳的。我不需要一个完整的解决方案,而不是指针和概念解释。

这是目前为止的代码:

代码语言:javascript
复制
# matrix input
  
rOne = int(input("Number of rows:")) 
cOne = int(input("Number of columns:")) 
  
# initialize matrix 
matrixOne = [] 
print("Enter elements rowwise:") 
  
# user input
for i in range(rOne):          # for loop za redove
    a =[] 
    for j in range(cOne):      # for loop za kolone 
         a.append(int(input())) 
    matrixOne.append(a) 
  
  

# print matrix one
for i in range(rOne): 
    for j in range(cOne): 
        print(matrixOne[i][j], end = " ") 
    print() 
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-12-13 01:11:38

实际上设法解决了这个问题,感觉很神奇:D

代码语言:javascript
复制
def get_neighbor_elements(current_row, current_col, total_rows, total_cols):
    neighbors = []
    for i in [-1, 0, 1]:  # red pre, isti red, red posle
        for j in [-1, 0, 1]:  # kolona pre, ista kolona, kolona posle
            row = current_row + i
            col = current_col + j
            if row < 0 or col < 0 or row >= total_rows or col >= total_cols:  # preskace se ako se izaslo iz granica matrice
                continue
            if row == current_row and col == current_col:# ako su red i kolona isti, preskace se(to je taj isti element)
                continue
            neighbor = [row, col]
            neighbors.append(neighbor)
    return neighbors
 
 
def make_new_matrix(old_matrix):
    new_matrix = []
    for i in range(len(old_matrix)):
        new_matrix.append([])
    for i in range(len(old_matrix)):  # iteriramo kroz redove stare matrice
        for j in range(len(old_matrix[i])):  # iteriramo kroz kolone stare matrice
            neighbors = get_neighbor_elements(i, j, len(old_matrix), len(old_matrix[i]))  # dobavljamo komsije
            count = 0
            for neighbor in neighbors:  # sad gledamo da li je trenutni element veci ili jednak susednim
                if old_matrix[i][j] >= old_matrix[neighbor[0]][neighbor[1]]:
                    count += 1
            new_matrix[i].append(count)
    return new_matrix
 
 
def print_matrix(matrix):
    for i in range(len(matrix)):
        for j in range(len(matrix[i])):
            print(str(matrix[i][j]) + "   ", end='')
        print()
 
 
if __name__ == '__main__':
    matrix = [[12, 10], [2, 10]]
    print("Old matrix: ")
    print_matrix(matrix)
    new_matrix = make_new_matrix(matrix)
    print("New matrix")
    print_matrix(new_matrix)
票数 0
EN

Stack Overflow用户

发布于 2020-12-13 01:17:41

下面是一个可以做同样事情的函数:

代码语言:javascript
复制
def adj_matrix(matrixOne, rOne, cOne):
    
    new_lst = []
    
    for i in range(rOne):
        a = []
        for j in range(cOne):
            count = 0
            x, y = (i, j) # matrix values here
            cells = list(starmap(lambda a,b: (x+a, y+b), product((0,-1,+1), (0,-1,+1)))) # this will find all the adjacent index
    
            filtered_cell = [p for p in cells if (sum(p)>=0 and prod(p)>=0)] # this filters out all the negative indexs
            filtered_cell = [p for p in filtered_cell if p[0]<rOne and p[1]<cOne] # this filters out index that are greater than matrix
    
            for z in filtered_cell:
                if matrixOne[i][j] >= matrixOne[z[0]][z[1]]:
                    count += 1
            
            a.append(count-1)
        new_lst.append(a)

    return new_lst

同时导入:

代码语言:javascript
复制
from itertools import product, starmap

from math import prod
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65266075

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档