перестановка для pd.Series вызывает изменение на месте - PullRequest
0 голосов
/ 17 октября 2018

Я знаю разницу между np.random.permutation и np.random.shuffle.

Но когда я использую np.random.permutation для pd.Series, это случайно приведет к изменению ряда на месте, а также к кадру данных визменение места.

Я знаю, как переставить его по-другому, но я хочу знать, если это проблема дизайна для numpy или pandas?

демоданные показывают:

import pandas as pd
import numpy as np
t = pd.Series([1,2,3,4])
#np.random.permutation(t)
assert all(t == np.random.permutation(t))

Это не повысит AssertionError.Это выведет перемешанный массив.Но когда вы проверяете t, он также меняется.

Если вы используете np.array или list, все будет в порядке.

t = np.array([1,2,3,4])
np.random.permutation(t)
assert all(t == np.random.permutation(t))

Это повысит AssertionError.

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Это ошибка в numpy .Для некоторых объектов, подобных массиву, numpy.random.permutation переставляет свой аргумент на месте.Согласно строке документации, она должна возвращать перемешанную копию ввода;он не должен изменять ввод на месте.

Как вы отметили в вопросе, вы можете избежать этой проблемы, передавая фактический массив numpy.Если t является пандой Series, вы можете использовать np.random.permutation(t.values).

0 голосов
/ 17 октября 2018

Я добавил цикл для проверки функции assert и использовал .any (), чтобы заменить «all».

import numpy as np

for i in range(100):
    t = np.array([1, 2, 3, 4])
    assert (t != np.random.permutation(t)).any(), print('Assertion at', i)

В выходных данных показывалось, что утверждение происходит случайным образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...