You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:27:51