我在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
答案 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]
或者我错过了什么?