Numpy 索引过滤改变多个变量

Numpy index filtering changing multiple variables

我注意到在对 numpy 数组 (b[b < 3] = 0) 应用索引过滤时出现意外结果。已从或分配给正在过滤的变量的任何变量都将应用相同的过滤器,即如果 b = aa 将使用与 b.[=23 相同的过滤器进行过滤=]

我已经创建了一个测试文件来查看当索引过滤应用于变量时哪些变量会受到影响。我有 运行 下面的代码,给出的结果与我期望得到的结果一致。

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)

class 生成的结果在顶部,我期望的结果在底部。

当我运行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]]

发生这种情况是因为您将变量 a、b、c 和 d 分配给同一个数组。将变量视为对该数组的访问。如果对这个数组应用过滤。然后它将影响所有变量,因为它们指向同一个数组。如果你想根据这个分离数组,你可以使用像 arr_b = arr_a.copy() 或 arr_b = arr_a[:].

这样的复制方法