NumPy 索引 迭代 Resheap

来源:互联网 发布:几个excel表数据合并 编辑:程序博客网 时间:2024/05/17 08:04
原文地址:http://blog.csdn.net/lsjseu/article/details/20359201

在原文基础上适当精简并更正少量原作者的笔误:


索引,切片和迭代

1. 一维数组可以被索引、切片和迭代,就像列表和其它Python序列。

>>> a =arange(10)**3>>> aarray([  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>>> aarray([-1000,     1, -1000,    27, -1000,  125,   216,   343,  512,   729])>>> a[ ::-1]                                 #reversed aarray([  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)>>> barray([[ 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 barray([ 1, 11, 21, 31, 41])>>> b[ :,1]                       # equivalent to theprevious examplearray([ 1, 11, 21, 31, 41])>>> b[1:3,: ]                     # each column inthe second and third row of barray([[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)))>>> aarray([[ 7.,  5., 9.,  3.],       [ 7., 2.,  7.,  8.],       [ 6., 8.,  3.,  2.]])>>> a.shape(3, 4)

8. 一个数组的形状可以被多种命令修改:

>>> a.ravel() # flatten the arrayarray([ 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函数改变数组自身。

>>> aarray([[ 7.,  5.],       [ 9., 3.],       [ 7., 2.],       [ 7., 8.],       [ 6., 8.],       [ 3., 2.]])>>> a.resize((2,6))>>> aarray([[ 7.,  5., 9.,  3.,  7., 2.],           [ 7., 8.,  6.,  8., 3.,  2.]])

如果在改变形状操作中一个维度被赋值为-1,其维度将自动被计算。


0 0
原创粉丝点击