Python numpy数据指针地址无需更改即可更改 - python

编辑

经过一些摆弄之后,到目前为止,我已经隔离了以下状态:

一维数组在直接输入变量时提供两个不同的地址,而在使用print()时仅提供一个地址
2D数组(或矩阵)在直接输入变量时提供三个不同的地址,在使用print()时提供两个地址
3D数组在直接输入变量时提供两个不同的地址,而在使用print()时仅给出一个(显然与一维数组相同)

像这样:

>>> a = numpy.array([1,2,3], dtype="int32")

>>> a.data
<memory at 0x7f02e85e4048>
>>> a.data
<memory at 0x7f02e85e4110>
>>> a.data
<memory at 0x7f02e85e4048>
>>> a.data
<memory at 0x7f02e85e4110>
>>> a.data
<memory at 0x7f02e85e4048>

>>> print(a.data)
<memory at 0x7f02e85e4110>
>>> print(a.data)
<memory at 0x7f02e85e4110>
>>> print(a.data)
<memory at 0x7f02e85e4110>
>>> print(a.data)
<memory at 0x7f02e85e4110>
>>> print(a.data)
<memory at 0x7f02e85e4110>


>>> d = numpy.array([[1,2,3]], dtype="int32")

>>> d.data
<memory at 0x7f02e863ae48>
>>> d.data
<memory at 0x7f02e863a9e8>
>>> d.data
<memory at 0x7f02e863aac8>
>>> d.data
<memory at 0x7f02e863ae48>
>>> d.data
<memory at 0x7f02e863a9e8>
>>> d.data
<memory at 0x7f02e863aac8>

>>> print(d.data)
<memory at 0x7f02e863ae48>
>>> print(d.data)
<memory at 0x7f02e863a9e8>
>>> print(d.data)
<memory at 0x7f02e863ae48>
>>> print(d.data)
<memory at 0x7f02e863a9e8>
>>> print(d.data)
<memory at 0x7f02e863ae48>


>>> b = numpy.matrix([[1,2,3],[4,5,6]], dtype="int32")

>>> b.data
<memory at 0x7f02e863a9e8>
>>> b.data
<memory at 0x7f02e863ae48>
>>> b.data
<memory at 0x7f02e863aac8>
>>> b.data
<memory at 0x7f02e863a9e8>
>>> b.data
<memory at 0x7f02e863ae48>

>>> print(b.data)
<memory at 0x7f02e863aac8>
>>> print(b.data)
<memory at 0x7f02e863a9e8>
>>> print(b.data)
<memory at 0x7f02e863aac8>
>>> print(b.data)
<memory at 0x7f02e863a9e8>
>>> print(b.data)
<memory at 0x7f02e863aac8>


>>> c = numpy.matrix([[1,2,3],[4,5,6],[7,8,9]], dtype="int32")

>>> c.data
<memory at 0x7f02e863aac8>
>>> c.data
<memory at 0x7f02e863a9e8>
>>> c.data
<memory at 0x7f02e863ae48>
>>> c.data
<memory at 0x7f02e863aac8>
>>> c.data
<memory at 0x7f02e863ae48>
>>> c.data
<memory at 0x7f02e863a9e8>
>>> c.data
<memory at 0x7f02e863aac8>

>>> print(c.data)
<memory at 0x7f02e863ae48>
>>> print(c.data)
<memory at 0x7f02e863a9e8>
>>> print(c.data)
<memory at 0x7f02e863ae48>
>>> print(c.data)
<memory at 0x7f02e863a9e8>
>>> print(c.data)
<memory at 0x7f02e863ae48>


>>> e = numpy.array([[[0,1],[2,3]],[[4,5],[6,7]]], dtype="int32")

>>> e.data
<memory at 0x7f8ca0fe1048>
>>> e.data
<memory at 0x7f8ca0fe1140>
>>> e.data
<memory at 0x7f8ca0fe1048>
>>> e.data
<memory at 0x7f8ca0fe1140>
>>> e.data
<memory at 0x7f8ca0fe1048>


>>> print(e.data)
<memory at 0x7f8ca0fe1048>
>>> print(e.data)
<memory at 0x7f8ca0fe1048>
>>> print(e.data)
<memory at 0x7f8ca0fe1048>

原始帖子

我的印象是,仅在python控制台中输入一个变量,然后回显一个仅描述其值(和类型)的字符串。它的格式与print()的格式不同,但是我假设它们返回的值都相同。

当我尝试输出一个numpy对象的数据指针对象的地址时,每隔一次输入变量就会给我不同的值,而print()会给出相同的值。

这表明这两个操作的区别不仅在于输出的格式如何,还在于它们从何处获取信息。但是这些额外的差异到底由什么组成?

>>> a = numpy.array([0,1,2])

>>> a
array([0, 1, 2])
>>> print(a)
[0 1 2]

>>> print(a.data)
<memory at 0x7ff25120c110>
>>> print(a.data)
<memory at 0x7ff25120c110>
>>> print(a.data)
<memory at 0x7ff25120c110>

>>> a.data
<memory at 0x7ff25120c110>
>>> a.data
<memory at 0x7ff253099818>
>>> a.data
<memory at 0x7ff25120c110>
>>> a.data
<memory at 0x7ff253099818>
>>> a.data
<memory at 0x7ff25120c110>

python大神给出的解决方案

memoryview返回的a.data似乎在两个(或多个)视图之间交替。如果存储给定的a.data实例,则会得到一致的输出:

>>> a.data
<memory at 0x7fb88ea1f828>
>>> a.data
<memory at 0x7fb88e98c4a8>
>>> t = a.data
>>> a.data
<memory at 0x7fb88e98ce48>
>>> a.data
<memory at 0x7fb88e98c3c8>
>>> a.data
<memory at 0x7fb88e98c4a8>
>>> a.data
<memory at 0x7fb88e98ce48>
>>> a.data
<memory at 0x7fb88e98c3c8>
>>> a.data
<memory at 0x7fb88e98c4a8>
>>> t
<memory at 0x7fb88ea1f828>
>>> t
<memory at 0x7fb88ea1f828>
>>> t
<memory at 0x7fb88ea1f828>

请注意,在上面的示例中,有3个地址轮换;我很确定这都是实现细节。我猜想其中涉及一些缓存,这意味着每次访问a.data时实际上并没有生成新视图。

您还可以确保您正在查看单独的视图对象:

>>> id(a.data)
140430643088968
>>> id(a.data)
140430643086280
>>> id(a.data)
140430643088968
>>> id(a.data)
140430643086280

因此,大多数困惑可能来自以下事实:a.data的属性符号会表明它是我们正在讨论的固定对象,而事实并非如此。

Python pytz时区函数返回的时区为9分钟 - python

由于某些原因,我无法从以下代码中找出原因:>>> from pytz import timezone >>> timezone('America/Chicago') 我得到:<DstTzInfo 'America/Chicago' LMT-1 day, 18:09:00 STD…

实例化类型<?>的泛型类 - java

我正在为SCJP / OCPJP学习,并且遇到了一个对我来说很奇怪的示例问题。该示例代码实例化了两个通用集合:List<?> list = new ArrayList<?>(); List<? extends Object> list2 = new ArrayList<? extends Object>(); …

python异常行为中的LISTS(参考单个维度列表) - python

a = [0]*4 a[0]= 1 print(a) 根据Strange behavior of lists in python中解释的列表的行为,输出为[1,0,0,0],而应为[1,1,1,1],其中说*创建的是对对象的引用,而不是值的副本。请解释 python大神给出的解决方案 是的,使用重复运算符*创建对列表中对象的多个引用。但是,a[0] = 1不…

Spacy如何将标记标签整体化? - python

在包含#标签(例如tweet)的句子中,spacy的令牌生成器将标签分为两个令牌:import spacy nlp = spacy.load('en') doc = nlp(u'This is a #sentence.') [t for t in doc] 输出:[This, is, a, #, sentence, .…

timedelta64 [ns]-> FutureWarning:不建议传递timedelta64-dtype数据,在将来的版本中会引发TypeError - python

假设df['time']来自类型timedelta64[ns]和df['a']以及df['b']来自类型float64,可以如下绘制两个系列:import pandas as pd import matplotlib.pyplot as plt fig, axs = plt.subplots(2, …