为什么索引Numpy列可以创建副本,但不能用于行或1D数组



假设我有一个名为array1D:的数组

array1D
array([0, 1, 2, 3, 4, 5])

然后我取它的切片,并将其值分配给22

slice_of_array1D = array1D[0:3]
slice_of_array1D[:] = 22

如果我检查我从中获得切片的原始数组,前3个值也会变为22

array1D
array([22, 22, 22,  3,  4,  5])

现在我明白了,这样做是为了节省内存,因为slice_of_array1D只引用array1D,而不是创建副本,这需要使用array1D.copy((。然而,我感到困惑的是,为什么它不对矩阵列也这样做?。这里有一个例子:

array2D
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])

现在,让我们截取array2D的一部分,即第一列,并调用它来显示它的外观:

slice_of_array2D = array2D[:,[0]]
slice_of_array2D
array([[1],
[4],
[7]])

现在,让我们将切片的值分配给22,调用切片,然后调用原始数组2D

slice_of_array2D[:] = 22
slice_of_array2D
array([[22],
[22],
[22]])
array2D
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])

看看原始数组2D是如何保持不变的?为什么会发生这种情况。对行而不是列执行此操作确实会更改原始矩阵中的值,就像对1D数组执行此操作一样。然而,正如您在上面看到的,列似乎是免疫的。现在,Python中有这样的理由吗?我之所以提出这个问题,是因为我正在学习Python/Numpy使用它而不是MATLAB,所以我的大部分工作都将使用矩阵和线性代数等

谢谢朋友们!我为这个长问题道歉,但我想包括所有可能相关的信息:(

这里只是索引选项的示例:

In [431]: arr = np.arange(1,13).reshape(3,4)                                                   
In [432]: arr                                                                                  
Out[432]: 
array([[ 1,  2,  3,  4],
[ 5,  6,  7,  8],
[ 9, 10, 11, 12]])

带标量的索引降低维度:

In [433]: arr[1]                                                                               
Out[433]: array([5, 6, 7, 8])      # (4,)
In [434]: arr[:,1]                                                                             
Out[434]: array([ 2,  6, 10])      # (3,)

这些元素仍然可以访问:

In [435]: arr[:,1] +=10                                                                        
In [436]: arr                                                                                  
Out[436]: 
array([[ 1, 12,  3,  4],
[ 5, 16,  7,  8],
[ 9, 20, 11, 12]])

带列表的索引保留维度:

In [437]: arr[:,[1]]                                                                           
Out[437]:                 # (3,1) 
array([[12],
[16],
[20]])
In [438]: arr[[1]]                                                                             
Out[438]: array([[ 5, 16,  7,  8]])     # (1,3)

带有若干项目列表的索引;尾部:可选:

In [439]: arr[[1,2],:]                                                                         
Out[439]: 
array([[ 5, 16,  7,  8],
[ 9, 20, 11, 12]])

具有多个数组的索引-这里是类似"对角线"的选择(在MATLAB中更难做到(:

In [440]: arr[[1,2],[1,2]]                                                                     
Out[440]: array([16, 11])

这里是块选择(典型的MATLAB(:

In [441]: arr[[[1],[2]],[1,2]]                                                                 
Out[441]: 
array([[16,  7],
[20, 11]])

与切片(视图(相同的选择:

In [442]: arr[1:3,1:3]                                                                         
Out[442]: 
array([[16,  7],
[20, 11]])

相关内容