转置然后拉威尔一个Numpy数组不给出一个视图?

2024-04-20 00:59:09 发布

您现在位置:Python中文网/ 问答频道 /正文

transpose和ravel都提供了原始数组的视图。但结合在一起,我得到了一个新的阵列

假设我创建一个Numpy数组,a = np.arange(10).reshape(2,5)

In [13]: a = np.arange(10).reshape(2,5)
In [14]: a
Out[14]:
array([[0, 1, 2, 3, 4],
       [5, 6, 7, 8, 9]])

我把它转过来:

In [15]: b = a.T
In [16]: b
Out[16]:
array([[0, 5],
       [1, 6],
       [2, 7],
       [3, 8],
       [4, 9]])

我可以检查b是a的视图,目前还可以。然后我做b.ravel()

In [17]: c = b.ravel()
In [18]: c
Out[18]: array([0, 5, 1, 6, 2, 7, 3, 8, 4, 9])

现在python告诉我c不再是b或a的视图。这可以通过np.may_share_memory(b, c)或通过编辑b中的元素来检查:

In [19]: np.may_share_memory(b, c)
Out[19]: False

In [20]: b[1,0] = 100
In [21]: print(b)
    ...: print(a)
    ...: print(c)
[[  0   5]
 [100   6]
 [  2   7]
 [  3   8]
 [  4   9]]
[[  0 100   2   3   4]
 [  5   6   7   8   9]]
[0 5 1 6 2 7 3 8 4 9]

那么,这里发生了什么?虽然每一步(转置、拉威尔)都是原始数组的视图,但结合在一起,我得到了一个新数组