【问题标题】:How do 2d array list comprehensions work? [duplicate]二维数组列表推导如何工作? [复制]
【发布时间】:2021-01-02 18:13:21
【问题描述】:

我正在练习列表理解技术,对此我有点困惑。

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 列,但是左边的 jj in range(10) 有什么关系呢?

对此感到非常困惑,如果有人能将其翻译成实际发生的事情,我将不胜感激。

另外,在 Java 中,您可以像这样初始化二维数组:int[][] arr1 = new int[5][2]; // 5 rows, 2 columns,您可以在没有列表理解的情况下在 python 中实现这一点吗?

【问题讨论】:

  • 不要那样做。列表推导牺牲了 NumPy 的好处。
  • 如果您只想要一个 x-by-y 数组,请使用 numpy.zeros
  • 不过我还是有点理解的,我们的讲师使用这些。
  • 首先省略np.array 部分,并专注于理解本身。查看它生成的嵌套列表。这是基本的python。
  • 这能回答你的问题吗? List comprehension on a nested list?

标签: python numpy list-comprehension


【解决方案1】:

嵌套列表:

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

(在这里它们是“堆叠的”,因为子列表更长;它被“打印得很漂亮”。

外部列表有 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 的组合构建 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']]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-07
    • 2023-03-27
    • 1970-01-01
    • 2011-03-13
    • 2014-06-25
    • 2021-05-04
    • 2010-11-17
    相关资源
    最近更新 更多