使用np.ogrid构造指数递增方阵时遭遇索引越界错误的求助
解决构造幂矩阵时的索引越界问题
问题背景
需要构造s×s矩阵$V_{0} = (c_{i}^{j - 1})$($i, j \in {1,…,s}$),具体列要求:
- 第一列为$(0,0,…,0)$
- 第二列为$(c_{1}, c_{2},…, c_{s})$
- 最后一列为$((c_{1})^{s}, (c_{2})^{s},…, (c_{s})^{s})$
已定义含s个元素的向量$c$,尝试以下代码时出现索引越界错误:
import numpy as np import random s = 4 c = np.array([random.randint(1,10)]*(s)) print(c) m = 4 n = 4 i,j = np.ogrid[:m,:n] V = c[i]*(j-1) print(V)
报错信息:
IndexError Traceback (most recent call last) <ipython-input-5-f744ca90252c> in <cell line: 9>() 7 n = 4 8 i,j = np.ogrid[:m,:n] ----> 9 V = c[i+1]*j 10 print(V) IndexError: index 4 is out of bounds for axis 0 with size 4
错误原因
- 索引越界:
ogrid[:m,:n]生成的i是行索引矩阵,取值范围为0~3(s=4),i+1会得到1~4,但数组c的合法索引仅为0~3,索引4超出数组长度导致报错。 - 运算逻辑错误:需求是幂运算$c_{i}^{j-1}$,但代码中误用乘法
*,不符合公式要求。 - 第一列处理偏差:按公式$c_{i}^{j-1}$,j=1时结果为1,但需求要求第一列为全0,需单独处理。
解决方法与修正代码
核心修正点
- 去掉索引偏移
i+1,直接用c[i]实现行元素的广播匹配 - 将乘法替换为幂运算
** - 单独将第一列设为全0,满足需求
修正后的代码:
import numpy as np import random s = 4 # 生成s个不同的随机数(原代码会生成重复值,可选优化) c = np.array([random.randint(1, 10) for _ in range(s)]) print("向量c:", c) # 生成行、列索引网格 i, j = np.ogrid[:s, :s] # 构造幂矩阵:对应公式c_i^(j),j从0到s-1(对应需求中j'从1到s,j = j'-1) V = c[i] ** j # 将第一列替换为全0,符合需求 V[:, 0] = 0 print("构造的矩阵V0:\n", V)
补充说明
若需最后一列为$c_is$(与公式$c_i{j-1}$的$s-1$次方有偏差),可调整列索引范围,将幂运算的指数改为j+1,再修正第一列:
i, j = np.ogrid[:s, :s] V = c[i] ** (j + 1) V[:, 0] = 0
内容的提问来源于stack exchange,提问作者sakabukayo
相关产品推荐
相关产品推荐

