我可以使 Numpy 数组不可变吗?

Can I make a Numpy array immutable?

这个post

建议使用 .flags.writeable = False

使 Numpy 数组不可变的方法

然而,当我测试这个时:

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 数组,但我怀疑编码会更复杂并且更慢。

这是 numpy 1.22 及更早版本 numpy.random.shuffle 中的错误。当数组是一维时,函数不考虑输入数组的 writeable 标志。

numpy.random.Generator.shuffle 有同样的问题,numpy.random.Generator.permuted 不遵守任何维度数组的 writeable 标志。

这已经fixed在NumPy的主要开发分支中,所以NumPy 1.23.0及之后的版本不会有这个bug。请注意,NumPy 1.22.0 尚未发布,但可作为候选版本使用。修复发生在1.22的分支之后,所以修复不会在1.22.0.