Python生成Excel单元格(A1至ZZ1500000)矩阵映射的高效方案求助
问题描述
需要生成从A1到ZZ1500000的Excel单元格坐标矩阵,尝试用numpy的matmul方法实现时因字符类型不支持矩阵乘法报错,只能用Python嵌套循环生成,速度极慢,求更高效的实现方案。
现有代码
import numpy as np import string row_nums = np.arange(1,200000,1) row_nums = list(map(str, row_nums)) col_nums = [] set_char_l = [] alphabets = list(string.ascii_uppercase) #set_char = 'A' for i in range(1, 703, 26): if i <= 26: for item in alphabets: col_nums.append(item) elif (i // 26) < 27: set_char = round(i // 26) - 1 new_char = alphabets[set_char] set_char_l.append(new_char) for item in alphabets: col_nums.append(new_char + item) cell_nums = [] for col in col_nums: for row in row_nums: cell_no = col + row cell_nums.append(cell_no) cell_nums = np.array(cell_nums) cell_nums = cell_nums.reshape(len(row_nums), len(col_nums))
尝试用matmul的代码:
cell_nums = np.matmul(row_nums.reshape(-1,1), col_nums)
报错信息
UFuncTypeError: ufunc 'matmul' did not contain a loop with signature matching types (dtype('<U6'), dtype('<U2')) -> None
解决方案
1. 高效生成列名(A-Z、AA-ZZ)
利用numpy的向量化操作生成列名,替代循环拼接:
import numpy as np import string alphabets = np.array(list(string.ascii_uppercase)) # 生成单字母列名 single_cols = alphabets # 生成双字母列名:通过笛卡尔积拼接所有AA-ZZ组合 double_cols = np.char.add(alphabets[:, None], alphabets).ravel() # 合并单、双字母列名 col_nums = np.concatenate([single_cols, double_cols])
2. 利用广播机制生成最终矩阵
numpy的广播可以自动扩展数组维度,直接完成字符串拼接,完全避免嵌套循环:
# 生成1到1500000的行号并转为字符串数组 row_nums = np.arange(1, 1500001).astype(str) # 广播拼接:row_nums[:, None] 转为(N,1)维度,与(M,)维度的col_nums广播为(N,M)的二维数组 cell_matrix = np.char.add(col_nums, row_nums[:, None])
优势说明
- 所有操作基于numpy底层C实现的向量化逻辑,比Python循环快数十倍甚至上百倍
- 代码简洁直观,无需手动处理维度转换和循环嵌套
- 直接生成目标二维数组,省去了先创建一维列表再reshape的额外步骤
验证:cell_matrix[0,0] 为'A1',cell_matrix[-1,-1] 为'ZZ1500000',完全符合需求。
内容的提问来源于stack exchange,提问作者Zohaib
相关产品推荐
相关产品推荐

