NumPy 索引 迭代 Resheap

11 篇文章 0 订阅
原文地址:http://blog.csdn.net/lsjseu/article/details/20359201

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


索引,切片和迭代

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,其维度将自动被计算。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值