gpt4 book ai didi

python - Numpy 1D 与 nD 数组(按引用索引与按值索引)

转载 作者:行者123 更新时间:2023-11-30 22:59:56 29 4
gpt4 key购买 nike

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

在一维情况下,position_3 与数组中最初分配的值匹配(即,看起来 position_3 是一维数组的副本),而在二维情况下position_3 在更改数组时发生变化(即,position_3 看起来像是来自 2D 数组的引用)。

import numpy as np

print "Testing 1D array"

D1_array = np.array([0,1,2,3,4])
position_3 = D1_array[3]
D1_array[3] = 0

print "Value at position 3 in array: %i"%(D1_array[3]) #: 0
print "Value at position_3 variable: %i"%(position_3) #: 3

print "Testing 2D array"
D2_array = np.array([[0,1,2],[3,4,5],[6,7,8],[9,10,11],[12,13,14]])
position_3 = D2_array[3]
D2_array[3] = [0,0,0]

print "Value at position 3 in array: %s"%(str(D2_array[3])) #: [0,0,0]
print "Value at position_3 variable: %s"%(str(position_3)) #: [0,0,0]

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

最佳答案

the docs on Basic Slicing and Indexing :

The simplest case of indexing with N integers returns an array scalar representing the corresponding item....

All arrays generated by basic slicing are always views of the original array. (my emphasis)

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

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_3 = D1_array[3],则 position_3 将保存此数组标量的值。使用 D1_array[3] = 0 修改原始数组不会影响 position_3 的值。

相比之下,用整数索引二维数组会返回 a view :

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

修改 View 也会改变原始数组,修改原始数组也会影响 View 。

关于python - Numpy 1D 与 nD 数组(按引用索引与按值索引),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35525001/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com