Numpy入门03---ndarray多维数组对象(下)

上篇文章咱们讲到了NumPy的建立、算术运算及广播特性。这篇文章咱们将继续学习NumPy。数组

01基础索引与切片

ndarray对象的内容能够经过索引或切片来访问和修改,与 Python 中 list 的切片操做同样。函数

import numpy as np
arr = np.arange(10)
print(arr)
print(arr[5])
print(arr[2:5])
print(arr[5:])
print(arr[:3])

结果以下:学习

区别于Python的内建列表,数组的切片是原数组的视图。这意味着数据并非被复制了,任何对于视图的修改都会反映到原数组上。3d

若是想要数组切片的拷贝而不是视图,就须要显式调用arr[x:y].copy()code

ndarray 数组能够基于 0 - n 的下标进行索引,切片对象能够经过内置的 slice 函数,并设置 start, stop 及 step 参数进行,从原数组中切割出一个新数组。对象

a = np.arange(10)
s = slice(2,7,2)   # 从索引 2 开始到索引 7 中止,间隔为2
print (a[s])

在二维数组中,每一个索引值对应的元素再也不是一个值,而是一个一维数组:blog

arr2d = np.array([[1,2,3],[4,5,6],[7,8,9]])
print(arr2d)
print(arr2d[2])
# 下面两种方式效果同样
print(arr2d[0][2])
print(arr2d[0, 2])

输出以下:索引

在展现二维数组的索引上,咱们能够将“0”轴看作行,“1”轴看作列。import

数组的切片索引

思考一下: 下面二维数组的切片意味着什么?基础

print(arr2d[:2])
print(arr2d[:2,1:])

数组沿着轴0进行了切片。表达式arr2d[:2]的含义为选择arr2d的前两行。

02 布尔索引

咱们能够经过一个布尔数组来索引目标数组。

布尔索引经过布尔运算(如:比较运算符)来获取符合指定条件的元素的数组。

如下实例获取大于 5 的元素:

x = np.array([[  0,  1,  2],[  3,  4,  5],[  6,  7,  8],[  9,  10,  11]])  
print ('咱们的数组是:')
print (x)
print ('\n')
# 如今咱们会打印出大于 5 的元素  
print  ('大于 5 的元素是:')
print (x >  5)
print(x[ x > 5 ])

结果以下:

可使用!=~对条件取反。如:

print(x[~(x > 5)])

多个条件并列时,可使用&|进行链接。

03 神奇索引

神奇索引(花式索引)是NumPy中的术语,用于描述使用整数数组进行数据索引。

花式索引根据索引数组的值做为目标数组的某个轴的下标来取值。

对于使用一维整型数组做为索引,若是目标是一维数组,那么索引的结果就是对应位置的元素;

若是目标是二维数组,那么就是对应下标的行。

花式索引跟切片不同,它老是将数据复制到新数组中。

arr1 = np.arange(32).reshape((8,4))
print(arr1)
print("------------1--------------")
print(arr1[[4,2,5,1]])
print("------------2--------------")
print(arr1[[-2,-1,-5,-3]])
print("------------3--------------")
print(arr1[[1,5,7,2],[0,3,1,2]])

结果:

04 数组转置和换轴

转置是一种特殊的数据重组形式,能够返回底层数据的视图而不须要复制任何内容。

数组拥有transpose方法,也有特殊的T属性。

arr2 = np.arange(15).reshape((3,5))
print("----转置前------")
print(arr2)
print("----转置后------")
print(arr2.T)

arr3 = np.arange(16).reshape((2,2,4))
print("--------转换前-------")
print(arr3)
print("--------转换后-------")
print(arr3.transpose(2,1,0))

转换规则:

0 [0,0,0] [0,0,0]
1 [0,0,1] [1,0,0]
2 [0,0,2] [2,0,0]
3 [0,0,3] [3,0,0]
4 [0,1,0] [0,1,0]
5 [0,1,1] [1,1,0]
6 [0,1,2] [2,1,0]
7 [0,1,3] [3,1,0]
8 [1,0,0] [0,0,1]
9 [1,0,1] [1,0,1]
10 [1,0,2] [2,0,1]
11 [1,0,3] [3,0,1]
12 [1,1,0] [0,1,1]
13 [1,1,1] [1,1,1]
14 [1,1,2] [2,1,1]
15 [1,1,3] [3,1,1]

其中第一列是值,第二列是转置前位置,第三列是转置后,看到转置后位置。

再例如:

print(arr2.transpose(1,0,2))

结果以下:

将轴转换:

0 [0,0,0] [0,0,0]
1 [0,0,1] [0,0,1]
2 [0,0,2] [0,0,2]
3 [0,0,3] [0,0,3]
4 [0,1,0] [1,0,0]
5 [0,1,1] [1,0,1]
6 [0,1,2] [1,0,2]
7 [0,1,3] [1,0,3]
8 [1,0,0] [0,1,0]
9 [1,0,1] [0,1,1]
10 [1,0,2] [0,1,2]
11 [1,0,3] [0,1,3]
12 [1,1,0] [1,1,0]
13 [1,1,1] [1,1,1]
14 [1,1,2] [1,1,2]
15 [1,1,3] [1,1,3]

swapaxes函数用于交换数组的两个轴,格式以下:

numpy.swapaxes(arr, axis1, axis2)
  • arr:输入的数组
  • axis1:对应第一个轴的整数
  • axis2:对应第二个轴的整数

举例:

a = np.arange(8).reshape(2,2,2)

print ('原数组:')
print (a)
print ('\n')

print ('调用 swapaxes 函数后的数组:')
print (np.swapaxes(a, 2, 0))

结果:

相关文章
相关标签/搜索