【发布时间】:2022-01-20 11:34:50
【问题描述】:
此帖https://stackoverflow.com/a/5541452/6394617
建议一种使 Numpy 数组不可变的方法,使用 .flags.writeable = False
但是,当我测试这个时:
arr = np.arange(20).reshape((4,5))
arr.flags.writeable = False
arr
for i in range(5):
np.random.shuffle(arr[:,i])
arr
数组在原地打乱,甚至没有警告。
问题:有没有办法使数组不可变?
背景:
对于上下文,我正在做机器学习,我有特征数组 X,它是浮点数和标签数组 y,它是整数。
我是 Scikit-learn 的新手,但从我读过的内容来看,fit 方法似乎将数组打乱了。也就是说,当我创建两个数组,为数据拟合模型,然后检查数组时,它们是原始顺序的。所以我只是不熟悉 Scikit-learn 是如何洗牌的,也无法在网上找到一个简单的解释。
我正在使用许多不同的模型,并在两者之间进行一些预处理,我担心在某些时候我的两个数组可能会被打乱,从而使行不再适当地对应。
如果我能让数组不可变,我会放心。我确信我可以切换到元组而不是 Numpy 数组,但我怀疑这会更复杂且更慢。
【问题讨论】:
-
我会搞砸术语,但
arr[:, i]返回的内容类似于数据的“视图”,而不是数组本身。np.random.shuffle(x)会报错 -
scikit-learn 的
fit不应该洗牌。如果它洗牌任何东西,它应该做整行。 -
@QuangHoang,我知道 scikit-learn 默认会随机播放(行,而不是列),但是当我在
clf.fit(X,y)之前调用X.flags.writeable = False并且没有导致任何错误时,我感到很惊讶,因为它在我看来,fit会尝试将数据改组,但不应该这样做。所以我不确定 scikit-learn 库是如何打乱数据的。我还没有深入研究每一行源代码,也没有时间,这就是为什么我希望有某种方法可以锁定数组,以防止 any 对其进行更改。 -
问题不在于
arr[:, i]是一个视图,而在于它是一个一维数组。当输入是一维数组时,shuffle方法似乎不尊重writeable标志。例如。x = np.arange(5); x.flags.writeable = False; np.random.shuffle(x)成功。这可能是shuffle方法中的一个错误。 -
@WarrenWeckesser,太好了,谢谢!你想把它作为答案发布,以便将来如果有人有这个问题,他们会发现他们只需要确保拥有最新版本的 NumPy?
标签: python arrays numpy shuffle