【问题标题】:Selecting a column from an array in Python在 Python 中从数组中选择一列
【发布时间】:2014-09-17 18:00:22
【问题描述】:

在尝试选择 2D 4x4 数组中的第一列(从零开始计数时)时,我编写了以下脚本:

import numpy
a4x4=[list(range(4*i,4*(i+1))) for i in list(range(4))]
print(a4x4)
print(a4x4[:,1])

数组好像没问题:

[[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11], [12, 13, 14, 15]]

但不是

[1, 5, 9, 13]

对于第二次打印,我收到此错误:

TypeError:列表索引必须是整数,而不是元组

为什么会出现这个错误,是怎么回事?

【问题讨论】:

  • 附带说明,您不需要那些额外的list 电话。 for i in list(range(4)) 将为您提供与 for i in range(4) 完全相同的结果,除了它会浪费时间和内存来构建一个与您已有的范围具有相同元素的列表。
  • 啊,谢谢。我记得 list() 是尝试打印该范围的残余。
  • 只是确保。很多人不明白 Python 是围绕泛型迭代构建的,列表并没有什么特别之处。范围、字符串、文件等内容同样是可迭代的。 (另一方面,Numpy不是围绕迭代构建的,而是围绕一次对整个数组或切片的强制转换操作构建的。)

标签: python arrays integer tuples


【解决方案1】:

你已经导入了 numpy 但你没有使用它。相反,您拥有的是列表列表,而 Python 不支持为此进行多维切片(即,您需要 [a4x4[i][1] for i in range(4)] 才能获得您期望的结果,但实际上您应该使用 numpy)。这是一个例子:

import numpy
a4x4=numpy.array([list(range(4*i,4*(i+1))) for i in list(range(4))])
print(a4x4)
print(a4x4[:,1])

顺便说一句,在numpy中你也可以直接构建你想要的数组,像这样:

 numpy.arange(4*4).reshape((4,4))

(而且在 Python 中也不需要我上面的 list 调用,我只是试图使代码尽可能与您的代码相似,以查看关键内容,即转换列表列表到一个 numpy 数组中。)

【讨论】:

  • 完美,我不知道切片仅适用于 numpy 数组。为什么列表列表和数组列表之间存在差异?
  • @Betohaku:切片适用于 numpy 数组和列表;只是 multidimensional 切片仅适用于 numpy 数组。
  • @Betohaku:有很多不同之处。数组支持多维切片、切片之间的数据共享、逐元素运算符以及一整套强大的方法,并且可以减少存储内存和许多操作所需的时间。列表列表支持异构值,支持“锯齿状”数组(行可以是不同的长度),与基于迭代的编程更容易互操作,并且不需要第三方库。 numpy 介绍文档更详细地解释了事情。
【解决方案2】:

您可以使用列表推导生成您想要的结果 - 就像您创建原始 4x4 一样:

a4x4=[list(range(4*i,4*(i+1))) for i in list(range(4))]
print([a4x4[i][1] for i in range(4)])

此外,您可以通过抛弃list 函数来稍微简化您的逻辑:

a4x4 = [range(4*i,4*(i+1)) for i in range(4)]
print([a4x4[i][1] for i in range(4)])

【讨论】:

  • 确实是一种直观的方法,但这似乎是一个迂回的道路,特别是因为它需要您知道数组的维度(当然在这个例子中你知道,但是想象一下在这个上下文之外的使用)。
  • +1,因为这个答案让我意识到自己的错误,但我仍然认为 OP 希望使用 numpy 而不是列表推导。
猜你喜欢
  • 2016-09-02
  • 2013-03-29
  • 1970-01-01
  • 1970-01-01
  • 2019-01-15
  • 1970-01-01
  • 2013-10-02
  • 1970-01-01
  • 2021-12-18
相关资源
最近更新 更多