Фильтрация индексом Numpy при изменении нескольких переменных - PullRequest
0 голосов
/ 04 июня 2019

Я замечаю неожиданные результаты при применении фильтрации индекса к массиву numpy (b[b < 3] = 0). Для любой переменной, которая была назначена из или для фильтруемой переменной, будет применен тот же фильтр, т. Е. Если b = a, a будет отфильтрован тот же фильтр, что и b.

Я создал тестовый файл, чтобы увидеть, на какие переменные влияют, когда к переменной применяется фильтрация индекса. Я выполнил приведенный ниже код с результатами, полученными в соответствии с тем, что я ожидал получить.

import numpy as np

class tester1(object):
    def __init__(self):
        self.a = np.array([[1, 2, 3], [4, 5, 6]])
        self.b = []
        self.c = []
        self.d = []

    def test1(self):
        self.b = self.a
        self.c = self.b
        self.d = self.c
        d = self.d
        e = d
        d[d < 3] = 0
        print('self.a')
        print(self.a)
        print('self.b')
        print(self.b)
        print('self.c')
        print(self.c)
        print('d')
        print(d)
        print('e')
        print(e)


class tester2(object):
    def __init__(self):
        self.d = np.array([[1, 2, 3], [4, 5, 6]])
        self.e = []
        self.t = tester1()
        self.t.test1()

    def test2(self):
        self.t.b = self.d
        self.t.c = self.t.b
        self.e = self.t.b
        self.t.b[self.t.b < 3] = 0
        print('self.t.b')
        print(self.t.b)
        print('self.t.c')
        print(self.t.c)
        print('self.d')
        print(self.d)
        print('self.e')
        print(self.e)

    def test3(self):
        print('self.d')
        print(self.d)
        self.e = self.d
        a = np.array([[False, False, False], [False, True, True]])
        f = self.d
        f[a] = 0
        print('self.d')
        print(self.d)
        print('self.e')
        print(self.e)
        print('f')
        print(f)

    def test4(self):
        a = self.t.a
        b = a
        c = b
        c[c > 4] = 2
        print('self.t.a')
        print(self.t.a)
        print('b')
        print(b)
        print('c')
        print(c)

Класс показал результаты сверху, а ожидаемые результаты - снизу.

когда я бегу t = tester2()

self.a  [[0 0 3] [4 5 6]]  # Actual
self.a  [[1 2 3] [4 5 6]]  # Expected


self.b  [[0 0 3] [4 5 6]]
self.b  [[1 2 3] [4 5 6]]

self.c  [[0 0 3] [4 5 6]]
self.c  [[1 2 3] [4 5 6]]

d   [[0 0 3] [4 5 6]]
d   [[0 0 3] [4 5 6]]

e   [[0 0 3] [4 5 6]]
e   [[1 2 3] [4 5 6]]

Когда я бегу t.test2()

self.t.b [[0 0 3] [4 5 6]]  # Actual
self.t.b [[0 0 3] [4 5 6]]  # Expected

self.t.c [[0 0 3] [4 5 6]]
self.t.c [[1 2 3] [4 5 6]]

self.d   [[0 0 3] [4 5 6]]
self.d   [[1 2 3] [4 5 6]]

self.e   [[0 0 3] [4 5 6]]
self.e   [[1 2 3] [4 5 6]]

Когда я бегу t.test3()

self.d  [[0 0 3] [4 5 6]]  # Actual
self.d  [[1 2 3] [4 5 6]]  # Expected

self.d  [[0 0 3] [4 0 0]]
self.d  [[1 2 3] [4 5 6]]

self.e  [[0 0 3] [4 0 0]]
self.e  [[1 2 3] [4 5 6]]

f   [[0 0 3] [4 0 0]]
f   [[1 2 3] [4 0 0]]

Когда я бегу t.test4()

self.t.a [[0 0 3] [4 2 2]]  # Actual
self.t.a [[1 2 3] [4 5 6]]  # Expected

b    [[0 0 3] [4 2 2]]
b    [[1 2 3] [4 5 6]]

c    [[0 0 3] [4 2 2]]
c    [[1 2 3] [4 2 2]]

1 Ответ

0 голосов
/ 04 июня 2019

Это происходит потому, что вы присваиваете переменные a, b, c и d одному и тому же массиву.Думайте о переменных как о доступе к этому массиву.Если вы примените фильтрацию к этому массиву.Тогда это повлияет на все переменные, так как они указывают на этот же массив.Если вы хотите разделить массив на основе этого, вы можете использовать метод копирования, например arr_b = arr_a.copy () или arr_b = arr_a [:].

...