如何切片2D Python数组?失败:“TypeError:列表索引必须是整数,而不是元组”

时间:2010-09-09 20:20:27

标签: python multidimensional-array numpy

我在numpy模块中有一个2d数组,如下所示:

data = array([[1,2,3],
              [4,5,6],
              [7,8,9]])

我想得到一个只包含某些元素列的数组。例如,我可能需要第0列和第2列:

data = [[1,3],
        [4,6],
        [7,9]]

最恐怖的方式是什么? (请不要循环)

我认为这样可行:

newArray = data[:,[0,2]]

但结果是:

TypeError: list indices must be integers, not tuple

7 个答案:

答案 0 :(得分:17)

错误明确表示:数据不是一个numpy数组,而是一个列表列表。

首先尝试将其转换为numpy数组:

numpy.array(data)[:,[0,2]]

答案 1 :(得分:7)

如果您想要切片2D 列表,以下功能可能会有所帮助

def get_2d_list_slice(self, matrix, start_row, end_row, start_col, end_col):
    return [row[start_col:end_col] for row in matrix[start_row:end_row]]

答案 2 :(得分:5)

实际上,你写的内容应该可以正常使用......你使用的是什么版本的numpy?

只是为了验证,以下内容应该与numpy的任何最新版本完美配合:

import numpy as np
x = np.arange(9).reshape((3,3)) + 1
print x[:,[0,2]]

对我而言,收益率:

array([[1, 3],
       [4, 6],
       [7, 9]])

应该......

答案 3 :(得分:3)

这可能不是你想要的,但这是可以的。 zip(* x)[你可能需要的任何列]

答案 4 :(得分:2)

为什么它适用于Numpy但不适用于Python列表

因为使用__getitem__,您可以使用:和多个参数为您编写类以执行任何操作。

Numpy这样做,但内置的list没有。

更确切地说:

class C(object):
    def __getitem__(self, k):
        return k

# Single argument is passed directly.
assert C()[0] == 0

# Multiple indices generate a tuple.
assert C()[0, 1] == (0, 1)

# Slice notation generates a slice object.
assert C()[1:2:3] == slice(1, 2, 3)

# If you omit any part of the slice notation, it becomes None.
assert C()[:] == slice(None, None, None)
assert C()[::] == slice(None, None, None)
assert C()[1::] == slice(1, None, None)
assert C()[:2:] == slice(None, 2, None)
assert C()[::3] == slice(None, None, 3)

# Tuple with a slice object:
assert C()[:, 1] == (slice(None, None, None), 1)

# Ellipsis class object.
assert C()[...] == Ellipsis

然后我们可以打开切片对象:

s = slice(1, 2, 3)
assert s.start == 1
assert s.stop == 2
assert s.step == 3

这就是为什么当你写:

[][1, 2]

Python说:

TypeError: list indices must be integers, not tuple

因为你试图将(1, 2)传递给列表__getitem__,并且内置列表没有编程来处理元组参数,只有整数。

答案 5 :(得分:1)

请注意numpy只接受每个元素具有相同大小的常规数组。 你可以以某种方式使用: [a[i][0:2] for i in xrange(len(a))] 它很丑陋但它确实有用。

答案 6 :(得分:0)

newArray = data[:,0:2]

或者我错过了什么?