创建好一个ndarray之后,接下来的问题是如何从一个数组中,获取元素。索引可以配合循环来访问所有的数组元素,而切片可以有选择的访问数组中的部分元素。
索引
Ndarray和其他语言的array一样,支持从0开始的索引来存取数组:
import numpy as np
# 对于一维数组
a = np.arange(10)**3
print(a)
'''
[ 0 1 8 27 64 125 216 343 512 729]
'''
# 取下标为2的元素,即为8
print(a[2])
'''
8
'''
# 同样可以给下标为2的元素赋值为 33
a[2] = 33
print(a)
'''
[ 0 1 33 27 64 125 216 343 512 729]
'''
# 对于二维数组来
a = np.arange(9)
a = a.reshape(3,3)
print(a)
'''
[[0 1 2]
[3 4 5]
[6 7 8]]
'''
# 指定一个下标,可以按照axis=1的方向取出一个数组
print(a[1])
'''
[3 4 5]
'''
# 指定两个下标,按照 array[axis1][axis0] 的方式可以取出二维数组中的特定值
print(a[1][2])
'''
5
'''
Python的神奇之处是允许用复数来当做索引。当复数作为索引的时候,它的意思是从数组的最末往前查找。例如a[-1] 和 a[2] 是相同的结果:
import numpy as np
print(a[-1])
'''
[6 7 8]
'''
print(a[2])
'''
[6 7 8]
'''
切片
Python里还有一个神奇的特性,就是切片。Python里原有的切片原理,在ndarray里都适用:
import numpy as np
# 对于一维数组
a = np.arange(10)**3
print(a)
'''
[ 0 1 8 27 64 125 216 343 512 729]
'''
# 取下标从2到5的元素,其中不包括下标为5的元素
print(a[2:5])
'''
[ 8 27 64]
'''
# 从第一个元素起,一共6个元素,按照步长为2计算,每隔一个步长,设定其第一个元素为1000
a[:6:2] = 1000
print(a)
'''
[1000 1 1000 27 1000 125 216 343 512 729]
'''
# 从第二个元素起,一共6个元素,按照步长为2计算,每隔一个步长,设定其第一个元素为1000
a[1::2] = 1000
print(a)
'''
[ 0 1000 8 1000 64 1000 216 1000 512 1000]
'''
# 对于二维数组来说,在每一个轴上都可以使用切片技术
def f(x, y):
return 10*x + y
# fromfunction函数通过f来生成数组。f的参数个数,要和fromfunction的第二个参数(元组类型)的个数对应,生成的数组的维度也跟f的参数个数一致。
# f的参数会从0开始以步长1的方式增长。
b = np.fromfunction(f, (5, 4), dtype=int)
print(b)
'''
[[ 0 1 2 3]
[10 11 12 13]
[20 21 22 23]
[30 31 32 33]
[40 41 42 43]]
'''
print(b[0:5, 1])
'''
[ 1 11 21 31 41]
'''
print(b[1:3, :])
'''
[[10 11 12 13]
[20 21 22 23]]
'''
如果只是想遍历所有的元素又不在乎层次的话,numpy还提供了一个将数组扁平化的函数flat:
import numpy as np
for element in b.flat:
print(element)
'''
0
1
2
3
10
11
12
13
20
21
22
23
30
31
32
33
40
41
42
43
'''
<<< Numpy的学习笔记(二) Numpy的学习笔记(四)>>>