在Python中访问数组列的最佳方法是什么?
在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])
来进行转换。