2D数组列表推导式是怎样工作的?
2D数组列表推导式是怎样工作的?
这个问题已经有答案了:
我正在练习列表推导的技巧,对于这个问题我有点困惑。
arr1 = np.array([[j for i in range(10)] for j in range(10)])
所以我理解,你想要为range(10)
中的每个i
获得一个数字j
,这有点不合理,因为你没有初始化j
,所以应该是i for i in range(10)
。然后我们以某种方式初始化了10列,并将左边的j
与j in range(10)
关联起来了吗?
对此非常困惑,如果有人能将其翻译成实际上正在发生的事情,我将不胜感激。
此外,在Java中您可以像这样初始化2D数组:int[][] arr1 = new int[5][2]; // 5行,2列
,你能在Python中不使用列表推导实现吗?
admin 更改状态以发布 2023年5月21日
嵌套列表:
In [14]: [[j for i in range(3)] for j in range(4)] Out[14]: [[0, 0, 0], [1, 1, 1], [2, 2, 2], [3, 3, 3]]
“堆叠”只是一个显示问题。这是一个列表的列表;它们是在一行上显示还是单独显示只是显示选择。底层数据结构是相同的。
更好的方法是,让我们使用 (不仅仅是迭代计数):
In [16]: [[(j,i) for i in range(3)] for j in range(4)] Out[16]: [[(0, 0), (0, 1), (0, 2)], [(1, 0), (1, 1), (1, 2)], [(2, 0), (2, 1), (2, 2)], [(3, 0), (3, 1), (3, 2)]]
(这里它们“堆叠”是因为子列表更长;它已经被“漂亮地打印”)。
外部列表有4个元素(范围4),内部列表有3个(加上元组)。
或者我们可以将索引合并并从嵌套列表中创建一个数组:
In [17]: [[i*j for i in range(3)] for j in range(4)] Out[17]: [[0, 0, 0], [0, 1, 2], [0, 2, 4], [0, 3, 6]] In [18]: np.array(_) Out[18]: array([[0, 0, 0], [0, 1, 2], [0, 2, 4], [0, 3, 6]])
但是在numpy
中,我们更喜欢从1d的组合构建2d数组
In [19]: np.arange(4)[:,None] * np.arange(3) Out[19]: array([[0, 0, 0], [0, 1, 2], [0, 2, 4], [0, 3, 6]])
但是如果你只想要0,使用
In [20]: np.zeros((4,3), dtype=int) Out[20]: array([[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]])
嵌套列表推导只是两个for循环的紧凑表达式:
In [21]: alist = [] In [22]: for j in range(4): ...: blist = [] ...: for i in range(3): ...: blist.append(f'{j}:{i}') ...: alist.append(blist) ...: In [23]: alist Out[23]: [['0:0', '0:1', '0:2'], ['1:0', '1:1', '1:2'], ['2:0', '2:1', '2:2'], ['3:0', '3:1', '3:2']]