Python Numpy 1D与nD阵列(按引用索引与按值索引)

Python Numpy 1D与nD阵列(按引用索引与按值索引),python,numpy,pass-by-reference,Python,Numpy,Pass By Reference,我最近注意到一个奇怪的现象。在下面的代码中,我正在创建一个1D或2D numpy数组,从数组中提取一个值(position_3),然后将提取的位置分配给另一个值 在1D情况下,position_3与数组中最初分配的值匹配(即看起来像position_3是1D数组的副本),而在2D情况下,position_3随着数组的更改而更改(即看起来像position_3是2D数组的引用) 我知道Python中的所有内容都是引用,但我不明白的是,为什么一维数组和二维数组之间的行为不一致?值得注意的是,与Pyt

我最近注意到一个奇怪的现象。在下面的代码中,我正在创建一个1D或2D numpy数组,从数组中提取一个值(
position_3
),然后将提取的位置分配给另一个值

在1D情况下,
position_3
与数组中最初分配的值匹配(即看起来像
position_3
是1D数组的副本),而在2D情况下,
position_3
随着数组的更改而更改(即看起来像
position_3
是2D数组的引用)

我知道Python中的所有内容都是引用,但我不明白的是,为什么一维数组和二维数组之间的行为不一致?值得注意的是,与Python列表的相同比较在这两种情况下都会产生类似复制的行为(即,在2D数组中,也就是嵌套列表中,
position_3
变量仍然存在[6,7,8])。

Per:

使用N个整数进行索引的最简单情况是返回一个数组标量 表示相应的项

通过基本切片生成的所有阵列始终是原始阵列的视图。(我的重点)

因此,使用整数索引一维数组将返回一个数组标量:

In [32]: D1_array =  np.array([0,1,2,3,4])

In [33]: D2_array = np.array([[0,1,2],[3,4,5],[6,7,8],[9,10,11],[12,13,14]])

In [36]: D1_array[3]
Out[36]: 3

In [37]: type(D1_array[3])   # an array scalar
Out[37]: numpy.int64
如果指定
position\u 3=D1\u数组[3]
,则
position\u 3
保存此数组标量的值。使用
D1_数组[3]=0修改原始数组不会影响
位置_3
的值

相反,使用整数索引二维数组会返回:

修改视图也会更改原始阵列,修改原始阵列也会影响视图

In [32]: D1_array =  np.array([0,1,2,3,4])

In [33]: D2_array = np.array([[0,1,2],[3,4,5],[6,7,8],[9,10,11],[12,13,14]])

In [36]: D1_array[3]
Out[36]: 3

In [37]: type(D1_array[3])   # an array scalar
Out[37]: numpy.int64
In [38]: D2_array[3]
Out[38]: array([ 9, 10, 11])

In [40]: type(D2_array[3])
Out[40]: numpy.ndarray

In [42]: D2_array[3].base is D2_array
Out[42]: True