我正在尝试将省份分配到一个区域,以便在游戏模式中使用。我有两张不同的地区和省份Map。provinces file、area file。目前,我正在使用PIL读入一个Python格式的图像并将其存储在一个数组中,如下所示:
import PIL
land_prov_pic = Image.open(INPUT_FILES_DIR + land_prov_str)
land_prov_array = np.array(land_prov_pic)
image_size = land_prov_pic.size
for x in range(image_size[0]):
if x % 100 == 0:
print(x)
for y in range(image_size[1]):
land_prov_array[x][y] = land_prov_pic.getpixel((x,y))
其中最终得到land_prov_array[x][y]=(R,G,B)
然而,这个Get非常慢,特别是对于大图像。我尝试使用OpenCV阅读它,如下所示:
import opencv
land_prov_array = cv2.imread(INPUT_FILES_DIR + land_prov_str)
land_prov_array = cv2.cvtColor(land_prov_array, cv2.COLOR_BGR2RGB) #Convert from BGR to RGB
但现在land_prov_array[x][y] = [R G B]
是ndarray
,不能插入到集合中。但它比前一个for循环快得多。如何在没有for循环的情况下为数组中的每个元素将[R G B]
转换为(R,G,B)
,或者更好的是,以这种方式读取它?
编辑:添加图片、更多说明和代码块以提高可读性。
2条答案
按热度按时间xeufq47z1#
当您需要将
[R,G,B]
数组转换为元组时,最好将其转换为元组,而不是将整个图像转换为这种形式。与数值型数组相比,元组数组占用的内存要多得多,处理起来也要慢得多。answer by isCzech展示了如何在3D数组上创建NumPy视图,该数组将数据呈现为元组的2D数组。这可能不需要实际元组数组的额外内存,但处理起来仍然要慢得多。
最重要的是,大多数NumPy函数(如
np.mean
)和运算符(如+
)不能应用于这样的数组。因此,必须在Python代码中(或使用@np.vectorize
函数)迭代数组,这比使用NumPy函数和运算符作为一个整体处理数组的效率要低得多。vlurs2pr2#
对于从3D数组(
data3D
)到2D数组(data2D
)的转换,我使用了以下方法:.view
修改数据类型,并返回大小为1的最后一维的3D数组,然后.squeeze
可以删除该数组。或者,您可以使用.squeeze(axis=-1)
仅挤压最后一个维度(以防其他维度也是1)。请注意,我使用的是
uint8
('u1'
)-您的类型可能不同。尝试使用循环来实现这一点确实非常慢(至少与这种方法相比是如此)。
这里有类似的问题:以图像的形式显示一个二维Numy数组,其中的内容是元组