二维数组列表理解如何工作?
How do 2d array list comprehensions work?
我正在练习列表理解技巧,对此我有点困惑。
arr1 = np.array([[j for i in range(10)] for j in range(10)])
所以我知道你想要一个数字 j
用于 range(10)
中的每个 i
,这有点没有意义,因为你没有初始化 j,所以它应该是i for i in range(10)
。然后我们以某种方式初始化 10 列,但是左边的 j
与 j in range(10)
有什么关系?
对此很困惑,如果有人能将其翻译成实际发生的事情,我将不胜感激。
此外,在 Java 中,您像这样初始化 2d 数组:int[][] arr1 = new int[5][2]; // 5 rows, 2 columns
,您可以在 python 中实现这一点而无需列表理解吗?
嵌套列表:
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]]
“堆叠”只是一个显示问题。这是一个列表列表;它们是显示在一行还是单独显示只是显示选择。底层数据结构相同。
更好,但让我们也使用 i
(不仅仅是迭代计数):
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)]]
(这里是“堆叠”的,因为子列表更长;已经 'pretty printed'。
外部列表有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
中,我们更喜欢从 1ds
的组合构建一个二维数组
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']]
我正在练习列表理解技巧,对此我有点困惑。
arr1 = np.array([[j for i in range(10)] for j in range(10)])
所以我知道你想要一个数字 j
用于 range(10)
中的每个 i
,这有点没有意义,因为你没有初始化 j,所以它应该是i for i in range(10)
。然后我们以某种方式初始化 10 列,但是左边的 j
与 j in range(10)
有什么关系?
对此很困惑,如果有人能将其翻译成实际发生的事情,我将不胜感激。
此外,在 Java 中,您像这样初始化 2d 数组:int[][] arr1 = new int[5][2]; // 5 rows, 2 columns
,您可以在 python 中实现这一点而无需列表理解吗?
嵌套列表:
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]]
“堆叠”只是一个显示问题。这是一个列表列表;它们是显示在一行还是单独显示只是显示选择。底层数据结构相同。
更好,但让我们也使用 i
(不仅仅是迭代计数):
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)]]
(这里是“堆叠”的,因为子列表更长;已经 'pretty printed'。
外部列表有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
中,我们更喜欢从 1ds
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']]