df['image'] = df['path'].map(lambda x: np.asarray(Image.open(x).resize((450,600))))如何将这一行代码改成使用Python的生成器来逐个读取
时间: 2024-01-31 20:01:41 浏览: 138
将这一行代码改成使用Python的生成器来逐个读取数据,可以使用Python的`yield`关键字来实现,代码如下:
```python
def load_images_generator(df, batch_size=32, target_size=(450, 600)):
while True:
for i in range(0, len(df), batch_size):
batch_df = df.iloc[i:i+batch_size]
images = []
for path in batch_df['path']:
img = Image.open(path).resize(target_size)
img_array = np.asarray(img)
images.append(img_array)
yield np.array(images)
```
这个`load_images_generator`函数接收一个DataFrame,一个批次的大小(默认为32),和目标图片大小(默认为`(450,600)`)。每当它被调用时,它会返回一个生成器对象,该对象可以逐个返回批次大小的图片数组。每个图片数组的形状为`(batch_size, 450, 600, 3)`。可以像下面这样使用这个生成器:
```python
my_generator = load_images_generator(df, batch_size=32, target_size=(450, 600))
for batch_images in my_generator:
# 进行批次处理
...
```
这样,就可以避免一次性将所有图片读入内存,而是逐个读取并返回。这种方法可以有效地减少内存占用,避免内存溢出的问题。
阅读全文