假设我有一个名为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]])