numpy 将列表中的数组转换为单个数组并追加零

6yoyoihd  于 2022-11-23  发布在  其他
关注(0)|答案(2)|浏览(154)

此代码片段的目标是创建一个形状(10,10)的二维数组,其中
数组[0,0]=1;
数组[0,9]=100;和
数组[9,0]=50。
当这些元素之间的间隔必须如预期输出中所示的那样相等时,就会出现复杂情况。行必须以相等的间隔增加到100,列必须以相等的间隔增加到50。
我知道我的代码在“matrix_list”的列表理解中有一个逻辑错误,但我不确定是什么错误。
我写的代码:

`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])]
  """
0s0u357o

0s0u357o1#

主要的问题是,你用列表解析的结果覆盖了预先分配的数组 matrix_list,而列表解析的结果只是一系列列表。这样,你就失去了开始定义的所有结构。(因为您也有一个问题,使numpy范围每次达到相同的数量,而不是像您所需的输出显示的那样按顺序递减),看看是否可以先在单个数组上进行补零操作,甚至可以将其作为for循环的一部分。
如果要创建填充的numpy数组,可以使用np.pad(X,pad_width=(before,after)),其中第二个参数允许指定在数组X前后添加多少个填充值。该函数的默认行为是在需要填充的位置添加零,这正是您所希望的。
至于让列表理解中的一切都正常工作,可以考虑使用enumerate(x)来帮助计算需要多少填充位以及在哪里停止计数。

bq9c1y66

bq9c1y662#

问题是你创建了一个numpy数组,然后你立即用list的list覆盖了你的变量。
无论如何,你应该用numpy broadcasting和linspace来处理这个问题,然后用布尔索引来屏蔽右下角的三角形:

matrix = (
    np.linspace(1, 100, 10, dtype=int)
   +np.linspace(0, 50-1, 10, dtype=int)[:,None]
)

n = np.arange(10)
matrix[(n >= (10-n)[:,None])] = 0

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]]

相关问题