逆时针旋转矩阵也会改变原始图像

时间:2018-11-12 23:14:12

标签: python python-3.x

所以我目前有一个逆时针旋转矩阵的功能,列表始终是一个正方形网格:

def rotate(m: List[List[int]]) -> None:
temp = m.copy()

if len(m) > 1:   
    for x in range(len(m)):
        for y in range(len(m)):
            temp[len(m)-1-y][x] = m[x][y]

m = temp.copy()

我已经反复跟踪了此功能,据我所知它应该正常工作。问题在于,由于某种原因,对温度的每次更改都会影响原始列表。例如,

ORIGINAL =

[[1, 2, 3], 

[4, 5, 6], 

[7, 8, 9]]

WHAT SHOULD OUTPUT = 

[[3, 6, 9], 

[2, 5, 8], 

[1, 4, 7]]

WHAT ACTUALLY OUTPUTS = 

[[3, 6, 1], 

[2, 5, 2], 

[1, 2, 1]

我在python ver 3.7.0上运行,并且尝试过滑动而不是复制字符串,但是发生了相同的事情。有人知道为什么吗?

2 个答案:

答案 0 :(得分:3)

由于m列表中的每个项目都是对子列表的引用,因此当您通过调用m复制m.copy()列表的副本时,它仅复制该列表的引用。子列表,而无需创建子列表的新副本,这就是对temp列表所做的每个更改都反映在原始m列表上的原因。

您还应该使用copy.deepcopy()来制作子列表的副本:

from copy import deepcopy
def rotate(m):
    temp = deepcopy(m)
    if len(m) > 1:
        for x in range(len(m)):
            for y in range(len(m)):
                temp[len(m)-1-y][x] = m[x][y]
    return temp

这样:

rotate([
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
])

返回:

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

或者,您可以通过压缩列表列表并将其反转来实现相同的矩阵旋转:

def rotate(m):
    return list(zip(*m))[::-1]

答案 1 :(得分:0)

exports.observeMessages = functions.database.ref('/conversation_messages/{topicId}/{messageId}')

  .onCreate((snapshot, context) => {

    var topic = context.params.topicId;
    var messageId = context.params.messageId;
    var message = snapshot.val();

    return admin.database().ref('/conversations/' + topic).once('value', snapshot => {

      var conversation = snapshot.val();  // This gives us the conversation name

        return admin.database().ref('/users/' + message.senderId).once('value', snapshot => {

          var user = snapshot.val();

          var notification = {
            notification: {
              title: conversation.conversationName,
              body: user.username + ': ' + message.text
            },
            apns: {
              payload: {
                aps: {
                  sound: 'default'
                }
              }
            },
            data: {
              conversationId: topic
            },
            topic: topic
          };

          admin.messaging().send(notification)
            .then((response) => {
              // Response is a message ID string.
              console.log('Successfully sent message:' + notification + 'to topic: ' + topic, response);
              return response
            })
            .catch((error) => {
              console.log('Error sending message:', error);
              throw new Error("Error sending message");
            });

      })

    })

  })

所以:

import copy

def rotate(m: [[int]]):
    temp = copy.deepcopy(m)
    if len(m) > 1:
        for x in range(len(m)):
            for y in range(len(m)):
                temp[len(m)-1-y][x] = m[x][y]
    return temp

输出:

rotate([
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
])

示例:https://onlinegdb.com/ryGU1jD6X