使用Numpy生成指定规则(10,10)二维数组遇错误求助
问题:创建指定规则的(10,10)二维数组
需创建形状为(10,10)的二维数组,要求如下:
- 数组左上角
array[0,0] = 1、右上角array[0,9] = 100、左下角array[9,0] = 50 - 元素按预期输出呈现等间隔递增:每行从左到右以步长11递增,直到达到该行有效元素上限;每列从上到下按特定间隔递增,首列元素依次为1、6、11、17、22、28、33、39、44、50
- 超出有效元素范围的位置补0
当前编写的代码中,列表推导逻辑存在错误,无法得到预期的(10,10)数组。
用户编写的代码
import numpy as np matrix_list = np.zeros((10,10), dtype = int) matrix_list = [(np.arange(column, 101, (100-1)/9).astype(int)) for column in np.arange(1, 51, (50-1)/9).astype(int)] print(np.array(matrix_list))
预期输出
[ 1, 12, 23, 34, 45, 56, 67, 78, 89, 100] [ 6, 17, 28, 39, 50, 61, 72, 83, 94, 0] [11, 22, 33, 44, 55, 66, 77, 88, 0, 0] [17, 28, 39, 50, 61, 72, 83, 0, 0, 0] [22, 33, 44, 55, 66, 77, 0, 0, 0, 0] [28, 39, 50, 61, 72, 0, 0, 0, 0, 0] [33, 44, 55, 66, 0, 0, 0, 0, 0, 0] [39, 50, 61, 0, 0, 0, 0, 0, 0, 0] [44, 55, 0, 0, 0, 0, 0, 0, 0, 0] [50, 0, 0, 0, 0, 0, 0, 0, 0, 0]
实际输出
[array([ 1, 12, 23, 34, 45, 56, 67, 78, 89, 100]) array([ 6, 17, 28, 39, 50, 61, 72, 83, 94]) array([11, 22, 33, 44, 55, 66, 77, 88, 99]) array([17, 28, 39, 50, 61, 72, 83, 94]) array([22, 33, 44, 55, 66, 77, 88, 99]) array([28, 39, 50, 61, 72, 83, 94]) array([33, 44, 55, 66, 77, 88, 99]) array([39, 50, 61, 72, 83, 94]) array([44, 55, 66, 77, 88, 99]) array([50, 61, 72, 83, 94])]
问题分析
- 覆盖初始数组:代码一开始创建了
(10,10)的全0数组,但随后用列表推导直接覆盖了这个变量,完全没利用初始数组来补0。 - 行长度不一致:
np.arange(column, 101, 11)生成的数组长度随首元素变化,导致各行元素数量不同,转成numpy数组后变成了object类型的不规则数组,不是预期的(10,10)二维数组。 - 有效元素数量错误:预期每行的有效元素数量为
10 - 行索引(第0行10个,第1行9个,...第9行1个),但当前代码是按元素不超过100来生成,导致部分行的元素数量不符合要求。
修正后的代码
import numpy as np # 初始化(10,10)全0数组 matrix = np.zeros((10, 10), dtype=int) # 首列的目标值 first_column = [1, 6, 11, 17, 22, 28, 33, 39, 44, 50] # 行内递增步长 row_step = 11 for i in range(10): # 每行有效元素个数:10 - i valid_count = 10 - i # 生成该行的有效元素 row_elements = [first_column[i] + row_step * j for j in range(valid_count)] # 赋值到数组的对应行 matrix[i, :valid_count] = row_elements print(matrix)
输出验证
运行修正后的代码,输出与预期完全一致:
[[ 1 12 23 34 45 56 67 78 89 100] [ 6 17 28 39 50 61 72 83 94 0] [ 11 22 33 44 55 66 77 88 0 0] [ 17 28 39 50 61 72 83 0 0 0] [ 22 33 44 55 66 77 0 0 0 0] [ 28 39 50 61 72 0 0 0 0 0] [ 33 44 55 66 0 0 0 0 0 0] [ 39 50 61 0 0 0 0 0 0 0] [ 44 55 0 0 0 0 0 0 0 0] [ 50 0 0 0 0 0 0 0 0 0]]
内容的提问来源于stack exchange,提问作者Rajath Agalkote
相关产品推荐
相关产品推荐

