Когда обновляется ndarray.T? [дубликат]

Sep 24 2020

В Numpy вы можете транспонировать a ndarrayс помощью transpose()метода, но у него также есть атрибут T.

Когда ndarrayизменяется не только возвращаемое значение transpose()метода, но и атрибут Tавтоматически обновляется одновременно.

ndarray.transpose()это функция, поэтому не стоит удивляться. Однако Tэто не функция, а простой атрибут, поэтому перед обращением к нему необходимо обновить.

  1. Все ли функции и методы Numpy обновляют Tатрибут каждый раз, когда они вызываются?

  2. Если да, то почему? Вероятно, что при работе с огромными матрицами вычислительные затраты на каждую операцию будут очень большими, даже если это не имеет отношения к транспонированию. Разве не разумнее вызывать transpose()только при необходимости, а не Tкаждый раз переписывать атрибут?

Это простой пример:

>>> import numpy as np
>>> x = np.array([[1, 2, 3],
...               [4, 5, 6]])
...
>>> x
array([[1, 2, 3],
       [4, 5, 6]])
>>> x.T
array([[1, 4],
       [2, 5],
       [3, 6]])

Конечно, xменяется x.Tи работа одновременно . Когда x.Tобновлялся? Сделал x.__imul__()это?

>>> x *= 100
>>> x
array([[100, 200, 300],
       [400, 500, 600]])
>>> x.T
array([[100, 400],
       [200, 500],
       [300, 600]])

Ответы

1 kabanus Sep 23 2020 at 22:24

TСвойство , которое является таким же , как .transpose()это просто вид с формой (и шагами) изменились. Память о фактическом содержании такой же (вы можете использовать id(x[0,0])и id(x.T[0,0]), например , чтобы проверить это), но свойства объекта рассказывает , numpyкак его интерпретировать. Для 2D-массива шаги и форма - это как раз обратные исходному массиву. Чтобы узнать больше о шагах, см. Документацию . Вот почему все происходит немедленно, когда содержимое изменяется - ячейка памяти получает новый номер, но интерпретация .Tмассива не меняется.