Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于如何在Python中存储numpy数组的一些困惑_Python_Arrays_Numpy - Fatal编程技术网

关于如何在Python中存储numpy数组的一些困惑

关于如何在Python中存储numpy数组的一些困惑,python,arrays,numpy,Python,Arrays,Numpy,在Python中使用数据类型numpy数组时,我有一些困惑 问题1 我在python intepreter中执行以下脚本 >>> import numpy as np >>> L = [1000,2000,3000] >>> A = np.array(L) >>> B = A 然后我检查以下内容: >>> A is B True >>> id(A) == id(B) True >&

在Python中使用数据类型numpy数组时,我有一些困惑

问题1

我在python intepreter中执行以下脚本

>>> import numpy as np
>>> L = [1000,2000,3000]
>>> A = np.array(L)
>>> B = A
然后我检查以下内容:

>>> A is B
True
>>> id(A) == id(B)
True
>>> id(A[0]) == id(B[0])
True
那很好。但是当时发生了一些奇怪的事情

>>> A[0] is B[0]
False
但是A[0]和B[0]怎么可能是不同的东西呢?他们有相同的身份证! 对于python中的列表,我们有

>>> LL = [1000,2000,3000]
>>> SS = LL
>>> LL[0] is SS[0]
True
存储numpy数组的方法与list完全不同?我们也有

>>> A[0] = 1001
>>> B[0]
1001
似乎A[0]和B[0]是相同的对象

问题2

我复印了一份

>>> C = A[:]
>>> C is A
False
>>> C[0] is A[0]
False
那很好。A和C似乎彼此独立。但是

>>> A[0] = 1002
>>> C[0]
1002

A和C似乎不是独立的?我完全糊涂了。

你在问两个完全独立的问题,所以这里有两个答案

  • Numpy数组的数据在内部存储为连续的C数组。数组中的每个条目都只是一个数字。另一方面,Python对象需要一些内务管理数据,例如引用计数和指向类型对象的指针。不能简单地在内存中有一个指向数字的原始指针。因此,如果访问单个元素,Numpy将在Python对象中“框”一个数字。每次访问元素时都会发生这种情况,因此即使是
    A[0]
    A[0]
    也是不同的对象:

    >>> A[0] is A[0]
    False
    
    这就是为什么Numpy可以以更节省内存的方式存储数组的核心:它不为每个条目存储完整的Python对象,只在需要时动态创建这些对象。它针对阵列上的矢量化操作而不是单个元素访问进行了优化

  • 当您执行
    C=A[:]
    时,您正在为相同的数据创建一个新视图。你不是在复制。然后将有两个不同的包装器对象,分别由
    A
    C
    指向,但它们由相同的缓冲区支持。数组的
    base
    属性指的是它最初从中创建的数组对象:

    >>> A.base is None
    True
    >>> C.base is A
    True
    
    当与索引结合使用时,相同数据上的新视图特别有用,因为您可以获得仅包含原始数组的某些片段,但由相同内存支持的视图

    要实际复制数组,请使用
    copy()
    方法


  • 作为更一般的说明,您不应该过多地阅读Python中的对象标识。一般来说,如果
    x是y
    为真,您就知道它们实际上是同一个对象。但是,如果返回false,则它们仍然可以是同一对象的两个不同代理。

    列表和数组的存储完全不同。请参阅回答,numpy v list copy。相关: