Разница между numpy.array и numpy.array [:] - PullRequest
0 голосов
/ 08 марта 2019

Я снова ...:)

Я пытался найти ответ на этот вопрос, но мне опять не повезло. Итак, вот оно.

В чем разница между вызовом пустого массива (скажем, "iris") и всей группы данных в этом массиве (например, с использованием iris [:]).

Я спрашиваю об этом из-за ошибки, которая возникает при запуске первого примера (ниже), тогда как второй пример работает нормально.

Вот код:

В этой первой части я загружаю библиотеку и импортирую набор данных из Интернета.

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)

С уважением,

Ответы [ 2 ]

2 голосов
/ 08 марта 2019

Разница в том, что когда вы делаете iris.columns.values = ..., вы пытаетесь заменить ссылку на свойство values в iris.columns, которое защищено (см. Реализацию pandas pandas.core.frame.DataFrame), и когда вы делаете iris.columns.values[:] = ..., вы получаете доступ данные np.ndarray и заменить его новыми значениями. Во втором операторе присваивания вы не перезаписываете ссылку на объект numpy. [:] - это объект slice, который передается методу __setitem__ массива numpy.

EDIT

Точная реализация (есть несколько, вот реализация pd.Series) такого свойства:

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

, таким образом, вы пытаетесь перезаписать свойство, созданное с помощью декоратора @property, за которым следует функция получателя, и не может быть заменено, поскольку оно предоставляется только с получателем, а не с установщиком. См. Документы Python о встроенных функциях - свойство ()

1 голос
/ 08 марта 2019
iris.columns.values = val

звонки

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

Это код pandas ', потому что type(iris.columns) равен pd.Series


iris.columns.values[:] = val

1012 * звонки *

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

Это код numpy, потому что type(iris.columns.value) равен np.ndarray

...