在原文基础上适当精简并更正少量原作者的笔误:
索引,切片和迭代
1. 一维数组可以被索引、切片和迭代,就像列表和其它Python序列。
>>> a =arange(10)**3
>>> a
array([ 0, 1, 8, 27, 64, 125, 216, 343, 512, 729])
>>> a[2]
8
>>> a[2:5]
array([ 8, 27, 64])
>>>a[:6:2] = -1000 # equivalent toa[0:6:2] = -1000; from start to position 6, exclusive, set every 2nd element to-1000
>>> a
array([-1000, 1, -1000, 27, -1000, 125, 216, 343, 512, 729])
>>> a[ ::-1] #reversed a
array([ 729, 512, 343, 216, 125, -1000, 27, -1000, 1, -1000])
>>> for i in a:
... print i**(1/3.),
...
nan 1.0 nan 3.0 nan5.0 6.0 7.0 8.0 9.0
2. 多维数组可以每个轴有一个索引。这些索引由一个逗号分割的元组给出。
>>> def f(x,y):
... return 10*x+y
...
>>> b =fromfunction(f,(5,4),dtype=int)
>>> b
array([[ 0, 1, 2, 3],
[10, 11, 12, 13],
[20, 21, 22, 23],
[30, 31, 32, 33],
[40, 41, 42, 43]])
>>> b[2,3]
23
>>> b[0:5,1]
# each row in thesecond column of b
array([ 1, 11, 21, 31, 41])
>>> b[ :,1]
# equivalent to theprevious example
array([ 1, 11, 21, 31, 41])
>>> b[1:3,: ]
# each column inthe second and third row of b
array([[10, 11, 12, 13],
[20, 21, 22, 23]])
3. 当少于轴数的索引被提供时,确失的索引被认为是整个切片:
>>>b[-1]
# the last row.Equivalent to b[-1,:]
array([40, 41, 42,43])
4. b[i] 中括号中的表达式被当作 i 和一系列 : ,来代表剩下的轴。NumPy也允许你使用“.”Example: b[i,...] 。
点(...)代表许多产生一个完整的索引元组必要的分号。如果x是秩为5的数组(即它有5个轴),那么:
x[1,2,…] 等同于x[1,2,:,:,:],
x[…,3] 等同于 x[:,:,:,:,3]
x[4,…,5,:] 等同 x[4,:,:,5,:].
>>> c = array( [[[ 0, 1, 2], # a 3D array (two stacked 2D arrays)
[ 10, 12, 13]],
[[100, 101,102],
[110, 112,113]] ] )
>>> c.shape (2, 2,3)
>>> c[1,...] # same as c[1,:,:] or c[1]
array([[100, 101, 102],
[110, 112, 113]])
>>> c[...,2] # same as c[:,:,2]
array([[ 2, 13],
[102,113]])
5. 迭代多维数组是就第一个轴而言的,即按行操作:
>>> for row in b:
... print row
[0 1 2 3]
[10 11 12 13]
[20 21 22 23]
[30 31 32 33]
[40 41 42 43]
6. 然而,如果想对数组中每一个元素进行运算,我们可以使用flat属性,该属性是数组元素的一个迭代器:
>>> for element inb.flat:
... print element,
...
0 1 2 3 10 11 12 1320 21 22 23 30 31 32 33 40 41 42 43
7. 更改数组的形状
一个数组的形状由它每个轴上的元素个数给出:
>>> a =floor(10*random.random((3,4)))
>>> a
array([[ 7., 5., 9., 3.],
[ 7., 2., 7., 8.],
[ 6., 8., 3., 2.]])
>>> a.shape
(3, 4)
8. 一个数组的形状可以被多种命令修改:
>>> a.ravel() # flatten the array
array([ 7., 5., 9., 3., 7., 2., 7., 8., 6., 8., 3., 2.])
>>> a.shape = (6,2)
>>> a.transpose() # 转置
array([[ 7., 9., 7., 7., 6., 3.],
[ 5., 3., 2., 8., 8., 2.]])
9. 由 ravel()展平的数组元素的顺序通常是“C风格”的,就是说,最右边的索引变化得最快,所以元素a[0,0]之后是a[0,1]。如果数组被改变形状(reshape)成其它形状,数组仍然是“C风格”的。NumPy通常创建一个以这个顺序保存数据的数组。函数 reshape() 和 ravel() 还可以被同过一些可选参数构建成FORTRAN风格的数组,即最左边的索引变化最快。
10. reshape函数改变参数形状并返回它,而 resize函数改变数组自身。
>>> a
array([[ 7., 5.],
[ 9., 3.],
[ 7., 2.],
[ 7., 8.],
[ 6., 8.],
[ 3., 2.]])
>>> a.resize((2,6))
>>> a
array([[ 7., 5., 9., 3., 7., 2.],
[ 7., 8., 6., 8., 3., 2.]])
如果在改变形状操作中一个维度被赋值为-1,其维度将自动被计算。