NumPy二维数组棋盘式(Checkboard-like)二进制选择实现问询
棋盘式选择NumPy数组元素的通用解法
你当前用test.flatten()[::2]的方法,在5x5这种行数和列数都是奇数的数组上刚好能得到符合要求的结果,但换成其他尺寸(比如4x4、5x4)就会失效——因为它本质是取扁平化后所有偶数索引的元素,并没有真正遵循“行交替选择奇偶位置”的规则。
下面给你一个通用的解决方案,不管数组是几行几列都能精准实现你的棋盘式选择需求:
方法:利用布尔索引生成匹配掩码
我们可以生成一个和原数组形状一致的布尔数组,用True标记需要保留的元素,再通过索引提取结果:
import numpy as np # 你的原始数组 test = np.arange(25).reshape((5, 5)) # 生成行/列索引数组,通过广播实现逐元素判断 row_idx = np.arange(test.shape[0])[:, np.newaxis] # 形状(5,1),和列索引广播 col_idx = np.arange(test.shape[1]) # 形状(1,5) # 核心规则:偶数行(0-based)选偶数列(对应1-based奇数位置),奇数行选奇数列(对应1-based偶数位置) mask = (row_idx % 2 == 0) & (col_idx % 2 == 0) | (row_idx % 2 == 1) & (col_idx % 2 == 1) # 提取结果 result = test[mask] print(result) # 输出:array([ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24])
简化写法(原理相同)
如果觉得上面的掩码逻辑有点繁琐,还可以用更简洁的方式实现:
# 行索引+列索引的和为偶数时,就是我们要的棋盘位置 mask = (np.arange(test.shape[0])[:, None] + np.arange(test.shape[1])) % 2 == 0 result = test[mask]
为什么这个方法通用?
不管数组的行数、列数是奇数还是偶数,这个逻辑都会动态适配:
- 0-based偶数行(第1、3、5...行):选择1-based的奇数位置元素(0-based偶数列)
- 0-based奇数行(第2、4、6...行):选择1-based的偶数位置元素(0-based奇数列)
比如换成4x4的数组测试:
test_4x4 = np.arange(16).reshape((4,4)) mask = (np.arange(test_4x4.shape[0])[:, None] + np.arange(test_4x4.shape[1])) % 2 == 0 result_4x4 = test_4x4[mask] print(result_4x4) # 输出:array([ 0, 2, 5, 7, 8, 10, 13, 15])
完全符合棋盘式的选择规则。
内容的提问来源于stack exchange,提问作者FooBar
相关产品推荐
相关产品推荐

