【问题标题】:Pandas: What is a view?熊猫:什么是视图?
【发布时间】:2017-06-05 12:51:21
【问题描述】:

请帮助我理解:Pandas 中的 view 是什么。 我知道,如果我们更改 view 中的某些内容,我们总是会更改原始对象。

但是一个对象的视图和原始对象有不同的id's,例如。这是否意味着view 是另一个引用原始对象的对象?机制是什么?

我试过了,但找不到解释。

import pandas as pd
import numpy as np

df = pd.DataFrame({'x': [1,2]})
print(df)
df_sub = df[0:1]
df_sub.x = -1
print(df_sub._is_view)               # True
print(id(df) == id(df_sub))          # False
print(np.shares_memory(df, df_sub))  # True

【问题讨论】:

  • 你能举个例子吗?
  • @cricket_007 确定,秒
  • 查看 this articlethis post 的 numpy 视图与副本。很多 pandas 要么类似于 numpy,要么实际上是表面下的 numpy,所以这个解释应该适用于你的大部分情况。
  • 如果我理解正确,视图是原始数据的子集...stackoverflow.com/questions/17960511/…
  • @bunji 谢谢,我已经阅读了这 2 篇文章。但我找不到解释什么是View :)

标签: python arrays pandas numpy


【解决方案1】:

要了解什么是视图,您必须知道什么是数组。数组不仅是您放入其中的“东西”(项目)。它(除其他外)还需要有关元素数量、数组形状以及如何解释元素的信息。

所以一个数组应该是一个至少包含这些属性的对象:

class Series:
    data    # A pointer to where your array is stored
    size    # The number of items in your array
    shape   # The shape of your array
    dtype   # How to interpret the array

因此,当您创建视图时,会创建一个新数组对象,但(这很重要)视图的 data 指针指向原始数组。它可以是偏移的,但它仍然指向一个属于原始数组的内存位置。但即使它与原始对象共享一些数据,大小、形状、dtype (, ...) 也可能已更改,因此它需要一个新对象。这就是为什么他们有不同的ids。

把它想象成窗户。你有一个花园(数组),你有几个窗户,每个窗户都是一个不同的对象,但它们都看着同一个(你的)花园。好吧,当然,通过一些切片操作,您将拥有更多 escher-like windows,但隐喻总是缺少一些细节 :-)

【讨论】:

  • 也可以将the stride attribute 添加到列表中。 NumPy 数组切片是一种常见的视图,它指向相同的基础数据,但具有不同的步幅(可能还有偏移)。
  • @unutbu 我同意它们很重要,尤其是在使用步骤进行切片时,但我认为在理解“什么是视图”时它们可能更令人困惑。
猜你喜欢
  • 2020-01-31
  • 2016-04-19
  • 2014-04-04
  • 2017-05-05
  • 2020-07-09
  • 2015-05-28
相关资源
最近更新 更多