Я медленно пытаюсь понять разницу между view
и copy
в numpy, а также mutable vs. immutable types.
Если я обращаюсь к части массива с 'advanced indexing', он должен вернуть копию. Это выглядит так:
In [1]: import numpy as np
In [2]: a = np.zeros((3,3))
In [3]: b = np.array(np.identity(3), dtype=bool)
In [4]: c = a[b]
In [5]: c[:] = 9
In [6]: a
Out[6]:
array([[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.]])
Так как c
- это просто копия, он не передает данные, а изменение не мутирует a
. Однако это меня смущает:
In [7]: a[b] = 1
In [8]: a
Out[8]:
array([[ 1., 0., 0.],
[ 0., 1., 0.],
[ 0., 0., 1.]])
Итак, кажется, даже если я использую расширенную индексацию, назначение по-прежнему обрабатывает вещь слева как представление. Очевидно, что строка a
в строке 2 - это тот же объект/данные, что и a
в строке 6, поскольку мутация c
не влияет на нее.
Итак, мой вопрос: есть ли a
в строке 8 тот же объект/данные, что и раньше (не считая диагонали, конечно), или это копия? Другими словами, были ли данные a
скопированы в новый a
или были ли эти данные мутированы на месте?
Например, это похоже на:
x = [1,2,3]
x += [4]
или как:
y = (1,2,3)
y += (4,)
Я не знаю, как это проверить, потому что в любом случае a.flags.owndata
есть True
. Пожалуйста, не стесняйтесь разрабатывать или отвечать на другой вопрос, если я думаю об этом в замешательстве.