熊猫:啥是视图?
Posted
技术标签:
【中文标题】熊猫:啥是视图?【英文标题】: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 article 和 this post 的 numpy 视图与副本。很多 pandas 要么类似于 numpy,要么实际上是表面下的 numpy,所以这个解释应该适用于你的大部分情况。 如果我理解正确,视图是原始数据的子集...***.com/questions/17960511/… @bunji 谢谢,我已经阅读了这 2 篇文章。但我找不到解释什么是View
:)
【参考方案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 (, ...) 也可能已更改,因此它需要一个新对象。这就是为什么他们有不同的id
s。
把它想象成窗户。你有一个花园(数组),你有几个窗户,每个窗户都是一个不同的对象,但它们都看着同一个(你的)花园。好吧,当然,通过一些切片操作,您将拥有更多 escher-like windows,但隐喻总是缺少一些细节 :-)
【讨论】:
也可以将thestride
attribute 添加到列表中。 NumPy 数组切片是一种常见的视图,它指向相同的基础数据,但具有不同的步幅(可能还有偏移)。
@unutbu 我同意它们很重要,尤其是在使用步骤进行切片时,但我认为在理解“什么是视图”时它们可能更令人困惑。以上是关于熊猫:啥是视图?的主要内容,如果未能解决你的问题,请参考以下文章