如何提取一个由像素的数值组成的numpandas数组作为numpy数组?

时间:2019-09-18 12:47:34

标签: python matplotlib geopandas shapely

我有一个GeoDataFrame,我想获得一个与GeoDataFrame.plot()相对应的numpy数组。

此刻,我的代码如下:

import numpy as np
import geopandas as gpd
from shapely.geometry import Polygon
import matplotlib.pyplot as plt
from PIL import Image

# Create GeoDataFrame
poly_list = [Polygon([[0, 0], [1, 0], [1, 1], [0, 1]])]
polys_gdf = gpd.GeoDataFrame(geometry=poly_list)

# Save plot with matplotlib
plt.ioff()
polys_gdf.plot()
plt.savefig('plot.png')
plt.close()

# Open file and convert to array
img = Image.open('plot.png')
arr = np.array(img.getdata())

这是一个最小的工作示例。我的实际问题是,我有成千上万个GeoDataFrame列表,即“ list_of_gdf”。

我的第一个想法是将其循环运行:

arr_list = []
for element in list_of_gdf:
    plt.ioff() 
    element.plot()
    plt.savefig('plot.png')
    plt.close()

    img = Image.open('plot.png')
    arr_list.append(np.array(img.getdata()))

这似乎可以以更快的方式完成,而不是例如保存并打开每个.png文件。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我为我找到了一个可行的解决方案。我没有使用matplotlib“后端agg将图形画布作为RGB字符串访问,然后将其转换为数组”(https://matplotlib.org/3.1.0/gallery/misc/agg_buffer.html),而不是将每个图片保存为.png并打开。

arr_list = []
for element in list_of_gdf:
    plt.close('all')
    fig, ax = plt.subplots()
    ax.axis('off')
    element.plot(ax = ax)
    fig.canvas.draw()
    arr = np.array(fig.canvas.renderer.buffer_rgba())
    arr_list.append(arr)