【问题标题】:Shuffling and importing few rows of a saved numpy file改组和导入保存的 numpy 文件的几行
【发布时间】:2020-06-25 11:59:39
【问题描述】:

我保存了 2 个 .npy 文件:

X_train - (18873, 224, 224, 3) - 21.2GB
Y_train - (18873,) - 148KB

X_train 是猫和狗的图像(猫在第一半,狗在第二半,未打乱),并与 Y_train 映射为 0 和 1。因此 Y_train 为 [1,1,1,1,1,1,。 ........,0,0,0,0,0,0].

我想随机导入 X 中的 256 张图像(猫和狗图像均占近 50-50%)及其在 Y 中的映射。由于数据量很大,我无法在我的 RAM 中导入 X_train。

因此我尝试了(第一种方法):

import numpy as np
np.random.seed(666555)
X_train = np.load('Processed/X_train.npy', mmap_mode='r')
X = np.random.shuffle(X_train)
X = X[:256, :, :, :]
Y_train = np.load('Processed/Y_train.npy', mmap_mode='r')
Y = np.random.shuffle(Y_train)
Y = Y[:256]

这会产生以下错误:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-68-8b2a13921b8d> in <module>
      2 np.random.seed(666555)
      3 X_train = np.load('Processed/X_train.npy', mmap_mode='r')
----> 4 X = np.random.shuffle(X_train)
      5 X = X[:256, :, :, :]
      6 Y_train = np.load('Processed/Y_train.npy', mmap_mode='r')

mtrand.pyx in numpy.random.mtrand.RandomState.shuffle()

mtrand.pyx in numpy.random.mtrand.RandomState.shuffle()

ValueError: assignment destination is read-only

我也尝试过(第二种方法):

import numpy as np
np.random.seed(666555)
X = np.memmap('Processed/X_train.npy', 'float64', shape = (256, 224, 224, 3), mode = 'c')
Y = np.memmap('Processed/Y_train.npy', 'float64', shape = (256), mode = 'c')
X = np.random.shuffle(X)
Y = np.random.shuffle(Y)
print(X)
print(Y)

这个输出:

None
None

在第二种方法中,我将只获得猫图像,因为 np.memmap 将仅收集第 256 张图像。那么洗牌就没用了。

请告诉我如何用任何方法做到这一点。

【问题讨论】:

  • 我想你想从 mmap 文件中随机选择一个包含 256 个项目的列表。我不会尝试就地改组文件。
  • 另外,你想random.shuffle 单独的数组吗?这会混淆标签!
  • 是的,我只想从 X 中的 X_train 和 Y 中的 Y_train 中随机选取 256 个项目。好吧,我从@Marco Cerliani 的以下答案中得到了解决方案

标签: python numpy numpy-ndarray numpy-memmap


【解决方案1】:

您的洗牌程序不正确。遵循此策略,您还将以与 Y 不同的方式洗牌 X(洗牌后 X 和 Y 之间不再匹配)。这是一个示范性的例子:

np.random.seed(666555)
xxx = np.asarray([1,2,3,4,5,6,7,8,9])
yyy = np.asarray([1,2,3,4,5,6,7,8,9])
np.random.shuffle(xxx)
np.random.shuffle(yyy)

print((yyy == xxx).all()) # False

这里是正确的程序:

np.random.seed(666555)
xxx = np.asarray([1,2,3,4,5,6,7,8,9])
yyy = np.asarray([1,2,3,4,5,6,7,8,9])
idx = np.arange(0,len(xxx))
np.random.shuffle(idx)

print((yyy[idx] == xxx[idx]).all()) # True

这样你也可以覆盖 None 问题

【讨论】:

    猜你喜欢
    • 2012-03-22
    • 2016-11-25
    • 2019-05-07
    • 2019-04-17
    • 2018-06-24
    • 2016-06-21
    • 2018-12-15
    • 1970-01-01
    • 2018-01-26
    相关资源
    最近更新 更多