gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 05:17:33 25 4
gpt4 key购买 nike

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 是一个指向数组数据开头的对象(如文档所述),则预计会在 A 上产生相同的结果,并且B

最佳答案

我更喜欢 __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 的评论更好。 “缓冲区对象”和数组数据缓冲区的地址之间存在差异。

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

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>

关于python - 什么是指向数组数据开头的 Python 缓冲区对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41315280/

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