如何创建每行按序数排列的100×100 NumPy矩阵?
解决方案
要生成每行以连续序数循环排列的100×100矩阵,无需用for循环复制再排序,这里提供两种高效的numpy实现方法:
方法一:利用循环移位(np.roll)
先创建1-100的基础数组,再对每行执行循环左移操作:
import numpy as np # 生成目标矩阵 matrix = np.array([np.roll(np.arange(1, 101), -i) for i in range(100)])
- 原理:
np.roll(arr, shift)会对数组做循环移位,负shift代表向左移。第i行(从0开始计数)左移i位后,恰好以i+1开头,末尾自动补上1到i的数值,完全匹配需求。
方法二:广播机制(无循环,更高效)
通过行列索引的广播计算每个位置的数值,适合大矩阵场景:
import numpy as np # 构造行索引(100x1)和列索引(1x100) row_idx = np.arange(100)[:, np.newaxis] col_idx = np.arange(100) # 直接计算每个位置的数值 matrix = (row_idx + col_idx) % 100 + 1
- 原理:对第i行第j列(均从0开始计数),数值可通过
(i+j) % 100 + 1得到,正好实现每行从i+1开始连续排列到100,再从1续接到i的效果。
你原有代码的问题
np.argsort(x)完全不是生成目标矩阵的正确方式:
np.argsort的作用是返回数组元素排序后的原始索引,而非生成新的数值排列。- 你的x是100行每行都是1-100的数组,每行排序后的索引都是0到99,因此得到的y是100×100的索引矩阵(索引从0开始,所以会出现0),和你要的目标矩阵毫无关系。
内容的提问来源于stack exchange,提问作者focus87krk
相关产品推荐
相关产品推荐

