[英]What is the difference between numpy.array([]) and 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.columns
中values
属性的引用(请参阅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.