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

如何用Numpy构建零矩阵中的十字形1图案(含首尾行全1)

高效实现Numpy矩阵的十字形图案(首末行全1)

嘿,如果你想在Numpy里高效创建带十字形的矩阵(要求首末行全为1,中间竖线也是1),别用Python循环啦!直接用Numpy的矢量化操作才是正确打开方式——不仅速度快,代码还更清晰。

先说说原代码的小问题

你的示例代码用了for循环来填充中间的1,但循环在Numpy里效率很低,尤其是当矩阵尺寸很大的时候。而且如果n是偶数(比如n=4),原循环逻辑得到的不是标准的十字形,而是反对角线的部分点,不符合十字的需求。

优化后的矢量化代码

直接利用Numpy的索引特性,一行搞定中间竖线:

import numpy as np

n = 3  # 换成你需要的任意正整数都可以
a = np.zeros((n, n), dtype=int)

# 填充首行和末行全为1
a[0, :] = 1
a[-1, :] = 1

# 填充中心列,形成十字的竖线——这一步直接批量赋值,不用循环!
a[:, n//2] = 1

print(a)

当n=3时,输出和你想要的完全一致:

[[1 1 1]
 [0 1 0]
 [1 1 1]]

为啥这方法更好?

  • 速度快:避免了Python层面的循环,直接用Numpy底层的C实现批量操作,n越大,优势越明显(比如n=1000时,矢量化比循环快几十倍都不止)。
  • 逻辑清晰:一眼就能看出是填充首末行和中心列,别人看代码也能立刻懂你的意图。
  • 兼容所有n:不管n是奇数还是偶数,都能得到标准的十字形。比如n=4时,输出是:
[[1 1 1 1]
 [0 0 1 0]
 [0 0 1 0]
 [1 1 1 1]]

完美符合十字的样式。

如果你确实需要原代码的反对角线逻辑

要是你的需求其实是填充反对角线(而非中心列),那也可以用矢量化方式实现,同样不用循环:

import numpy as np

n = 3
a = np.zeros((n, n), dtype=int)
a[0, :] = 1
a[-1, :] = 1

# 用矢量化索引填充反对角线,等价于原循环的逻辑,但效率更高
rows = np.arange(1, n)
cols = n - 1 - rows  # 对应原代码里的 -i-1(Numpy负索引等于n+负数值)
a[rows, cols] = 1

print(a)

这代码和你原代码的输出完全一样,但运行速度更快。

内容的提问来源于stack exchange,提问作者Kishan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 17:12:52