繁体   English   中英

numpy.array和numpy.array [:]之间的区别

[英]Difference between a numpy.array and numpy.array[:]

又是我... :)

我试图找到这个问题的答案,但我仍然不够幸运。 就是这样

调用一个numpy数组(比如说“ iris”)和该数组中的整个数据组(例如通过使用iris [:])有什么区别?

我之所以这样问,是因为我在运行第一个示例(如下)时遇到错误,而第二个示例运行良好。

这是代码:

在第一部分中,我加载了库并从Internet导入了数据集。

import statsmodels.api as sm
iris = sm.datasets.get_rdataset(dataname='iris',
                            package='datasets')['data']

如果我运行此代码,则会收到错误消息:

iris.columns.values = [iris.columns.values[x].lower() for x in range( len( iris.columns.values ) ) ]
print(iris.columns.values)

现在,如果我运行此代码,它将正常工作:

iris.columns.values[:] = [iris.columns.values[x].lower() for x in range( len( iris.columns.values ) ) ]
print(iris.columns.values)

最好的祝福,

区别在于,当您执行iris.columns.values = ...您尝试替换被保护的iris.columnsvalues属性的引用(请参阅pandas.core.frame.DataFrame pandas实现)以及执行该操作时iris.columns.values[:] = ...您访问np.ndarray的数据并将其替换为新值。 在第二个赋值语句中,您不会覆盖对numpy对象的引用。 [:]是一个slice对象,传递给numpy数组的__setitem__方法。

编辑

此类属性的确切实现(有多个,这里是pd.Series实现)是:

    @property
    def values(self):
        """ return the array """
        return self.block.values

因此,您尝试覆盖由装饰器 @property后接getter函数构造的属性,并且该属性只能由getter而不是setter提供,因此无法替换。 请参阅关于buildins的Python文档-property()

iris.columns.values = val

电话

type(iris.columns).__setattr__(iris.columns, 'values', val)

这正在运行pandas的代码,因为type(iris.columns)pd.Series


iris.columns.values[:] = val

电话

type(iris.columns.value).__setitem__(iris.columns.value, slice(None), val)

这正在运行numpy的代码,因为type(iris.columns.value)np.ndarray

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM