Манипулирование копией простой матрицы - PullRequest
0 голосов
/ 11 октября 2018

Я пытаюсь манипулировать копией матрицы следующим образом.

import numpy as np

A = np.matrix([[4, 1, -1, 1], [1, 4, -1, -1], [-1, -1, 5, 1], [1, -1, 1, 3]])

B = A

B[0, 0] = 0

Это также изменило бы ввод 00 в A на 0, но я не хочу, чтобы это произошло.Я попробовал это и с np.array (), но то же самое происходит снова.Я думаю, это потому, что A и B указывают на одно и то же место в памяти.

Я был бы признателен, если бы кто-нибудь дал мне знать, как предотвратить изменение A, пока B изменяется.

Ответы [ 5 ]

0 голосов
/ 11 октября 2018

Вы правы, что сейчас ваши B и A ссылаются на одно и то же место в памяти.Для вашей проблемы я бы порекомендовал

 numpy.matrix.copy

, ознакомьтесь с документацией здесь: https://docs.scipy.org/doc/numpy-1.10.4/reference/generated/numpy.matrix.copy.html

Там есть пример именно того, что вы ищете:

x = np.array([[1,2,3],[4,5,6]], order='F')
y = x.copy()

x.fill(0)

x =  array([[0, 0, 0],[0, 0, 0]])
y = array([[1, 2, 3],[4, 5, 6]])
0 голосов
/ 11 октября 2018

Вам необходимо создать копию объекта.Вы можете сделать это с numpy.copy , так как вы работаете с пустым объектом.

Итак, ваш код будет выглядеть так:

B = np.copy(A)

Есть двавиды копий, используемые с python.

Мелкая копия создает новый составной объект, а затем (по мере возможности) вставляет в него ссылки на объекты, найденные в оригинале.

Глубокая копия создает новый составной объект, а затем рекурсивно вставляет в него копии объектов, найденных в оригинале.

Они работают независимо от типа объекта.

from copy import copy, deepcopy

# Shallow copy
b= copy(a)

# Deep copy of object
b= deepcopy(a)
0 голосов
/ 11 октября 2018

Когда вы делаете B = A, B - это просто ссылка на уже существующий массив A.NumPy не копирует прямо из соображений эффективности.

Итак, вы должны использовать arr.copy() для копирования содержимого массива, как в:

In [9]: B = A.copy()                                                                                                                                                                                               

In [10]: A                                                                                                                                                                                                         
Out[10]: 
matrix([[ 4,  1, -1,  1],
        [ 1,  4, -1, -1],
        [-1, -1,  5,  1],
        [ 1, -1,  1,  3]])

# update an entry in array `B`
In [11]: B[0, 0] = 0                                                                                                                                                                                               

# A is unaffected
In [12]: A                                                                                                                                                                                                         
Out[12]: 
matrix([[ 4,  1, -1,  1],
        [ 1,  4, -1, -1],
        [-1, -1,  5,  1],
        [ 1, -1,  1,  3]])

# change happens only in array B
In [13]: B                                                                                                                                                                                                         
Out[13]: 
matrix([[ 0,  1, -1,  1],
        [ 1,  4, -1, -1],
        [-1, -1,  5,  1],
        [ 1, -1,  1,  3]])
0 голосов
/ 11 октября 2018

Попробуйте:

  B[:] = A

Это сделает глубокую копию

0 голосов
/ 11 октября 2018

Вы совершенно правы, A и B указывают на одинаковое распределение памяти в вашем случае.
numpy имеет функцию копирования для того, чего вы хотите достичь:

B = np.copy(A)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...