什么是指向数组数据开头的Python缓冲区对象?

2024-05-07 13:37:36 发布

您现在位置:Python中文网/ 问答频道 /正文

A = np.arange(12)
B = A.reshape(3, 4)
A[0] = 42
print(B)
print(A)
print(np.may_share_memory(A, B))
print(A.data == B.data)

运行上面的代码,我很惊讶print(A.data == B.data)返回False。似乎A和B共享了一些内存,他们的第一个元素应该共享。然后,如果numpy.ndarray.data是一个指向数组数据开头的对象(如文档所述),那么它将在AB上产生相同的结果。你知道吗


Tags: 内存代码numpyfalse元素sharedatanp
1条回答
网友
1楼 · 发布于 2024-05-07 13:37:36

我更喜欢用__array_interface__来查看属性,包括数据缓冲区地址:

In [766]: A = np.arange(12)
In [767]: B = A.reshape(3,4)
In [768]: A[0] = 42
In [769]: A
Out[769]: array([42,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])
In [770]: B
Out[770]: 
array([[42,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
In [771]: A.data
Out[771]: <memory at 0xb16ef5dc>
In [772]: B.data
Out[772]: <memory at 0xb1719cdc>
In [773]: A.__array_interface__
Out[773]: 
{'data': (156295616, False),
 'descr': [('', '<i4')],
 'shape': (12,),
 'strides': None,
 'typestr': '<i4',
 'version': 3}
In [774]: B.__array_interface__
Out[774]: 
{'data': (156295616, False),
 'descr': [('', '<i4')],
 'shape': (3, 4),
 'strides': None,
 'typestr': '<i4',
 'version': 3}

A.__array_interface__['data'][0]值不匹配

A.data的文档是:

Python buffer object pointing to the start of the array’s data

但对于普通的Python程序员来说,这可能是一种误导。@ajcr的评论更好。“buffer object”和数组数据缓冲区的地址之间存在差异。你知道吗

=============

我很少使用data属性。少数情况之一是使用ndarray函数创建数组

how can I specify the memory address of a Numpy array using ctypes?

In [806]: np.ndarray((4,),buffer=A.data, dtype=int, offset=12)
Out[806]: array([3, 4, 5, 6])
In [807]: np.ndarray((4,),buffer=B.data, dtype=int, offset=16)
Out[807]: array([4, 5, 6, 7])

==================

A.data只打印其repr,与以下内容一样无信息性:

In [808]: o=object()
In [809]: o
Out[809]: <object at 0xb729fc90>

相关问题 更多 >