如何基于两个列表的笛卡尔积创建元素为元组的二维NumPy数组?
解决方案:从笛卡尔积生成二维NumPy数组并处理块操作
一、生成目标二维NumPy数组
先实现func函数,将笛卡尔积按lt1的元素分组,重塑为指定结构的二维NumPy数组:
import numpy as np from itertools import product def func(cartesian_product): prod_list = list(cartesian_product) # 基于lt1、lt2的长度重塑数组,每行对应一个lt1元素的所有元组对 len_lt1 = len(lt1) len_lt2 = len(lt2) return np.array(prod_list).reshape(len_lt1, len_lt2) # 初始化原代码中的参数 b1 = 25 b2 = 40 step = 2 lt1 = list(range(1, b1+1, step)) # 转成list方便获取长度 lt2 = list(range(1, b2+1, step)) # 生成目标二维数组 result_arr = func(product(lt1, lt2))
测试验证
用你给出的示例测试:
lt1_test = [2, 3] lt2_test = [1, 4, 7] test_arr = func(product(lt1_test, lt2_test)) print(test_arr)
输出结果完全符合要求:
[[(2, 1) (2, 4) (2, 7)] [(3, 1) (3, 4) (3, 7)]]
二、固定大小块的创建、取值与剔除
1. 创建固定大小块
使用NumPy的sliding_window_view(需NumPy 1.20及以上版本)生成滑动块,可按需调整块大小和步长:
from numpy.lib.stride_tricks import sliding_window_view # 定义块的尺寸和滑动步长 block_height = 2 block_width = 2 step_height = 2 step_width = 2 # 生成所有块,形状为 (行数方向块数, 列数方向块数, block_height, block_width) blocks = sliding_window_view(result_arr, window_shape=(block_height, block_width))
2. 从字典中获取块对应值
假设你的字典结构为{元组键: 列表值},用向量化函数批量获取每个块元素的对应值:
# 示例字典(替换为你的实际字典) tuple_dict = { (1,1): [1,2], (1,3): [3,4], # ... 其他元组键值对 } # 定义取值函数,无对应键时返回空列表 def get_tuple_value(t): return tuple_dict.get(t, []) # 向量化函数,应用到所有块元素 get_value_vec = np.vectorize(get_tuple_value, otypes=[object]) block_values = get_value_vec(blocks)
3. 剔除不符合条件的块
根据需求设置剔除规则,比如剔除包含空列表的块:
valid_blocks = [] valid_block_values = [] # 遍历所有块,筛选符合条件的 for row_idx in range(blocks.shape[0]): for col_idx in range(blocks.shape[1]): current_block = blocks[row_idx, col_idx] current_values = block_values[row_idx, col_idx] # 示例规则:块内所有元组都能在字典中取到非空值 if all(len(val) > 0 for row in current_values for val in row): valid_blocks.append(current_block) valid_block_values.append(current_values) # 转为NumPy数组(可选操作) valid_blocks_arr = np.array(valid_blocks) valid_block_values_arr = np.array(valid_block_values)
内容的提问来源于stack exchange,提问作者Shew
相关产品推荐
相关产品推荐

