numpy 数组的访问方式主要由索引(indexing)、切片(slicing)、迭代(iterating),本节中主要以例子为讲解其访问方式

一维数组

一维数组访问方式,首先创建一个一维数

>>> a = np.arange(10)**3
>>> a
array([  0,   1,   8,  27,  64, 125, 216, 343, 512, 729])

按照索引方式 访问数组a的,其中index是从0开始, 分别访问index为2 和5的元素:

>>> a[2]
8
>>> a[5]
125

有的时候需要连续访问几个元素,可以用到切片访问,切片相当切蛋糕一样,从数组a中切出一块(块中的元素index是连续的),例如连续访问a中从2到4的几个元素

>>> a[2:5]
array([ 8, 27, 64])

注意以上切片范围左边为半闭区间,右边为半开区间即元素从2开始,到5之前结束,并不等于5, a[c:d]大于等于c小于d的元素集合

还可以按照指定的间隔,默认情况下间隔为1,将间隔该为2,修改index 6之前的元素为-1000:

>>>a[:6:2] = -1000 
>>>a
array([-1000,     1, -1000,    27, -1000,   125,   216,   343,   512,   729])

继续进行 如果 间隔为-1,则将其整个数组反转,次序颠倒

>>> a[ : :-1]    
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
nan
5.0
6.0
7.0
8.0
9.0

多维数组

多维数组可以按照每轴(维)的index 进行处理,可以以元组形式表示,没维的index使用逗号分开

首先创建一个多维数组

import numpy as np

>>>def f(x,y):
    return 10*x+y
    
>>> b = np.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]])

按照索引访问第2行第三列的元素,b[2,3]: 

>>> b[2,3]
23

按照切片方式,访问每行的 第一列的元素

>>>b[0:5, 1]
array([ 1, 11, 21, 31, 41])

 访问每行的 第一列的元素,还可以使用以下方式

>>>b[ : ,1]
array([ 1, 11, 21, 31, 41])

访问第1和2行所有的元素:

>>>  b[1:3, : ] 
array([[10, 11, 12, 13],
       [20, 21, 22, 23]])

迭代访问,可以按照每行进行迭代:

>>> 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]

当提供的索引数数少于轴数是,缺失的那部分则认为为全部的, b[-1]代表访问最后一行元素

>>> b[-1]
array([40, 41, 42, 43])

带小数点省略的访问方式

除了上述几种访问方式是,还有另外一种方式就是使用小数点进行省略'...',小数点代表了访问该轴(维)的所有元素,例如

有一个5轴(维)的数组,

  • x[1,2,...]相当于x[1,2,:,:,:]
  • x[...,3]相当于x[:,:,:,:,3]
  • x[4,...,5,:]相当于x[4,:,:,5,:]

例子如下:

import numpy as np

c=np.array([[[  0,  1,  2],
              [ 10, 12, 13]],
              [[100,101,102],
              [110,112,113]]])
print("c: ", c)
print("c shape: ", c.shape)
print("c[1,...]: ", c[1,...])
print("c[...,2]: ", c[...,2])

运行结果:

c:  [[[  0   1   2]
  [ 10  12  13]]

 [[100 101 102]
  [110 112 113]]]
c shape:  (2, 2, 3)
c[1,...]:  [[100 101 102]
 [110 112 113]]
c[...,2]:  [[  2  13]
 [102 113]]

多维迭代

一般多维迭代是按照一行进行迭代访问的,例如

import numpy as np

c=np.array([[[  0,  1,  2],
              [ 10, 12, 13]],
              [[100,101,102],
              [110,112,113]]])
for row in c:
    print(row)

运行结果: 

[[ 0  1  2]
 [10 12 13]]
[[100 101 102]
 [110 112 113]]

也可以按照每个具体的元素进行访问

import numpy as np

c=np.array([[[  0,  1,  2],
              [ 10, 12, 13]],
              [[100,101,102],
              [110,112,113]]])
for element in c.flat:
    print(element)

运行结果:

0
1
2
10
12
13
100
101
102
110
112
113