【发布时间】:2020-09-23 15:10:41
【问题描述】:
在 NumPy 中,您可以使用transpose() 方法转置ndarray,但它也有一个属性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]])
【问题讨论】:
-
ndarray.T只是ndarray的一个视图。 -
np.transpose将任务委托给x.transpose()方法。x.T是property,是调用该方法的简写方式。所以没有任何东西是提前计算或存储的。但是返回转置是(相对)快的——它是一个新数组,有自己的形状和步幅,但共享原始数据(view)。所以没有抄袭。