我可以使 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.
这个post
建议使用 .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 数组,但我怀疑编码会更复杂并且更慢。
这是 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.