【问题标题】:When does ndarray.T get updated? [duplicate]ndarray.T 什么时候更新? [复制]
【发布时间】:2020-09-23 15:10:41
【问题描述】:

在 NumPy 中,您可以使用transpose() 方法转置ndarray,但它也有一个属性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]])

【问题讨论】:

  • ndarray.T 只是ndarray 的一个视图。
  • np.transpose 将任务委托给 x.transpose() 方法。 x.T 是 property,是调用该方法的简写方式。所以没有任何东西是提前计算或存储的。但是返回转置是(相对)快的——它是一个新数组,有自己的形状和步幅,但共享原始数据(view)。所以没有抄袭。

标签: python numpy


【解决方案1】:

与.transpose() 相同的T 属性只是改变了形状(和步幅)的视图。实际内容的内存是一样的(可以使用id(x[0,0]) 和id(x.T[0,0]) 为例来验证这一点),但是对象属性告诉NumPy 如何解释它。

对于二维数组,步幅和形状正好与原始数组相反。要了解有关 strides 的更多信息,请参阅the documentation。这就是为什么当内容改变时事情是立即发生的——存储单元获得了新的数字,但.T数组的解释没有改变。

【讨论】:

    猜你喜欢
    • 2014-04-29
    • 1970-01-01
    • 2012-03-18
    • 2010-12-08
    • 2010-09-11
    • 2010-09-18
    • 2010-09-25
    • 1970-01-01
    • 2013-10-19
    相关资源
    最近更新 更多