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