我知道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
。
答案 0 :(得分:1)
那是bug in numpy。对于某些类似数组的对象,numpy.random.permutation
就地改组其参数。根据文档字符串,应该返回输入的改组副本;它不应就地更改输入。
正如您在问题中指出的那样,可以通过传入实际的numpy数组来避免此问题。如果t
是熊猫Series
,则可以使用np.random.permutation(t.values)
。
答案 1 :(得分:0)
我添加了一个循环来检查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)
输出显示断言是随机发生的。