您的位置:首页 > 编程语言 > Python开发

NumPy 索引 迭代 Resheap

2016-05-29 11:02 369 查看
原文地址: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,其维度将自动被计算。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python numpy