Когда обновляется ndarray.T? [дубликат]
В Numpy вы можете транспонировать a ndarrayс помощью transpose()метода, но у него также есть атрибут T.
Когда ndarrayизменяется не только возвращаемое значение transpose()метода, но и атрибут Tавтоматически обновляется одновременно.
ndarray.transpose()это функция, поэтому не стоит удивляться. Однако Tэто не функция, а простой атрибут, поэтому перед обращением к нему необходимо обновить.
Все ли функции и методы Numpy обновляют
Tатрибут каждый раз, когда они вызываются?Если да, то почему? Вероятно, что при работе с огромными матрицами вычислительные затраты на каждую операцию будут очень большими, даже если это не имеет отношения к транспонированию. Разве не разумнее вызывать
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]])
Ответы
TСвойство , которое является таким же , как .transpose()это просто вид с формой (и шагами) изменились. Память о фактическом содержании такой же (вы можете использовать id(x[0,0])и id(x.T[0,0]), например , чтобы проверить это), но свойства объекта рассказывает , numpyкак его интерпретировать. Для 2D-массива шаги и форма - это как раз обратные исходному массиву. Чтобы узнать больше о шагах, см. Документацию . Вот почему все происходит немедленно, когда содержимое изменяется - ячейка памяти получает новый номер, но интерпретация .Tмассива не меняется.