簡體   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