在Python中访问数组列的最佳方法是什么?

6 投票
7 回答
37977 浏览
提问于 2025-04-17 10:28

在Matlab中,可以用:来访问数组的一列。

>> array=[1 2 3; 4 5 6]

array =

     1     2     3
     4     5     6


>> array(:,2)

ans =

     2
     5

那么在Python中怎么做呢?

>>> array=[[1,2,3],[4,5,6]]
>>> array[:,2]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: list indices must be integers, not tuple
>>> array[:][2]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>

补充说明

我想要一个例子,适用于维度大于三的数组:

>> B = cat(3, eye(3), ones(3), magic(3))

B(:,:,1) =

     1     0     0
     0     1     0
     0     0     1


B(:,:,2) =

     1     1     1
     1     1     1
     1     1     1


B(:,:,3) =

     8     1     6
     3     5     7
     4     9     2

>> B(:,:,1)                             

ans =

     1     0     0
     0     1     0
     0     0     1

>> B(:,2,:)

ans(:,:,1) =

     0
     1
     0


ans(:,:,2) =

     1
     1
     1


ans(:,:,3) =

     1
     5
     9

7 个回答

4

如果你在使用Matlab,可能会想要安装一下NumPy库。通过使用NumPy,你可以这样做:

In [172]: import numpy as np

In [173]: arr = np.matrix('1 2 3; 4 5 6')

In [174]: arr
Out[174]: 
matrix([[1, 2, 3],
        [4, 5, 6]])

In [175]: arr[:,2]
Out[175]: 
matrix([[3],
        [6]])

需要注意的是,Python的索引是从0开始的(而Matlab是从1开始的),所以如果你想得到和你发的那段代码一样的切片,你可以这样做:

In [176]: arr[:,1]
Out[176]: 
matrix([[2],
        [5]])

其实,创建更高维度的numpy数组也很简单。比如你可以使用np.dstack

In [199]: B = np.dstack( (np.eye(3), np.ones((3,3)), np.arange(9).reshape(3,3)) )

In [200]: B.shape
Out[200]: (3, 3, 3)

In [201]: B[:,:,0]
Out[201]: 
array([[ 1.,  0.,  0.],
       [ 0.,  1.,  0.],
       [ 0.,  0.,  1.]])

In [202]: B[:,:,1]
Out[202]: 
array([[ 1.,  1.,  1.],
       [ 1.,  1.,  1.],
       [ 1.,  1.,  1.]])

In [203]: B[:,:,2]
Out[203]: 
array([[ 0.,  1.,  2.],
       [ 3.,  4.,  5.],
       [ 6.,  7.,  8.]])

这里是从上面三个数组的第二列形成的数组:

In [204]: B[:,1,:]
Out[204]: 
array([[ 0.,  1.,  1.],
       [ 1.,  1.,  4.],
       [ 0.,  1.,  7.]])

不过,NumPy没有创建魔方的功能,真是让人失望啊。叹气

8

你可以通过内置的 zip() 函数,把一个二维列表按列进行分组:

>>> array=[[1,2,3],[4,5,6]]
>>> zip(*array)
[(1, 4), (2, 5), (3, 6)]
>>> zip(*array)[1]
(2, 5)

需要注意的是,索引是从0开始的,所以如果你想获取第二列,就要用 zip(*array)[1],而不是 zip(*array)[2]zip() 返回的是元组,而不是列表。根据你使用的方式,这可能不是问题,但如果你需要列表的话,可以用 map(list, zip(*array)) 或者 list(zip(*array)[1]) 来进行转换。

15

使用 Numpy

>>> import numpy as np
>>> 
>>> a = np.array([[1,2,3],[4,5,6]])
>>> a[:, 2]
array([3, 6])

如果你是从Matlab过来的,这个链接可能会对你有帮助: 链接

撰写回答