数组算术
说明:numpy的数组能够进行数学运算,加减乘除等与使用与python一致。
示例:
import numpy as np
# + - * / #加减乘除
arr = np.array([[1,2,3],[4,5,6]])
print("arr+1:",arr+1)
print("arr-1:",arr-1)
print("arr*2:",arr*2)
print("arr/2:",arr/2)
print("arr*arr:",arr*arr)
结果:
arr+1: [[2 3 4]
[5 6 7]]
arr-1: [[0 1 2]
[3 4 5]]
arr*2: [[ 2 4 6]
[ 8 10 12]]
arr/2: [[0.5 1. 1.5]
[2. 2.5 3. ]]
arr*arr: [[ 1 4 9]
[16 25 36]]
索引和切片
说明:用法与python的列表基本一致,索引长度为n,从0开始,n-1结束。
索引
一维数组:
示例:
import numpy as np
arr = np.array([1,2,3,4,5])
print(arr[2]) #3
print(arr[1:2]) #2
多维数组:
示例:
import numpy as np
arr1 = np.array([[1,2,3],[4,5,6],[7,8,9]])
print(arr1[1][1]) #2
arr2 = np.array([
[[1,2,3],
[4,5,6],
[7,8,9]],
[[10,11,12],
[13,14,15]]
])
print(arr2[0][0][2]) #3
切片
一维数组:
与python数组一致,示例:
arr2 = np.array([1,2,3,4,5,6,7])
print(arr2[1:4]) #234
多维数组:
维度为(3,3,3)示例:
import numpy as np
arr2 = np.array([
[[1,2,3],
[4,5,6],
[7,8,9]],
[[10,11,12],
[13,14,15],
[11,12,13]],
[[14,15,16],
[17,18,19],
[20,21,22]]
])
print(arr2[1:2,0:1,0:1]) #[[[10]]]
说明:
arr2[1:2,0:1,0:1],第一个1:2切片是三个大数组的索引,这里的对应的列表是:
[[10,11,12],
[13,14,15],
[11,12,13]],
第二个0:1是从这个列表中在进行索引,对应的列表是:
[10,11,12],
第三个0:1是从列表中取值,这里取第一个值10,三次切片,所以打印的结果是[[[10]]]。
维度为(2,3,3,3)示例:
import numpy as np
arr2 = np.array([
[[[1,2,3],
[4,5,6],
[7,8,9]],
[[10,11,12],
[13,14,15],
[11,12,13]],
[[14,15,16],
[17,18,19],
[20,21,22]]],
[[[-1,-2,-3],
[-4,-5,-6],
[-7,-8,-9]],
[[-10,-11,-12],
[-13,-14,-15],
[-11,-12,-13]],
[[14,-15,-16],
[-17,-18,-19],
[-20,-21,-22]]]
])
print(arr2[1:2,2:3,1:2,2:3])
总结:
维度为(3,3,3)的数组切片时,arr = array[x:y,x:y,x:y]中,可以有三个切片索引,从最外层往内切。
维度为(2,3,3,3)的数组时,arr = array[x:y,x:y,x:y,x:y],有四层切片索引,以此类推,维度中有几个数就可以有几层切片,切片的值全放在一个列表中,用英文逗号分隔开。
整数数组索引
说明:给出“坐标”来获取目标元素
示例,获取(0,0)、(1,2)、(2,2)位置的元素
import numpy as np
arr = np.array([
[1,2,3],
[4,5,6],
[7,8,9]
])
arrGet = arr[[0,1,2],[0,2,2]]
print(arrGet) #169
布尔索引
说明:布尔索引通过布尔运算(如:比较运算符)来获取复合条件的数组,布尔数组可组合使用
示例一,根据布尔值选择部分列表:
import numpy as np
import random
letter = [True,False,False,True,False,False]
data = np.random.randn(6,6)
print(data)
print(data[letter])
结果:
data:
[[ 5.42184370e-01 4.68608934e-01 1.48410002e+00 1.34129050e+00
1.01747322e+00 4.05037611e-04]
[ 1.27425089e-01 -1.37241461e-01 9.99905106e-01 3.32867305e-01
-5.74688332e-01 -2.41242021e-01]
[-3.46236483e-01 -4.03468861e-01 -3.36213127e-01 -4.51944201e-01
1.72372542e+00 -4.41497457e-01]
[ 3.69163467e-01 -1.66264286e+00 1.69080517e-01 -1.79278959e+00
1.92304799e+00 1.97561770e+00]
[-8.61865039e-01 2.16902225e-01 -7.10846233e-01 -9.60861758e-01
8.84544395e-01 1.34472787e+00]
[ 3.67207156e-01 4.37854951e-01 1.81917362e+00 -2.98152164e-01
7.33791701e-01 7.46377162e-01]]
data[letter]:
[ 5.42184370e-01 4.68608934e-01 1.48410002e+00 1.34129050e+00
1.01747322e+00 4.05037611e-04]
[-3.46236483e-01 -4.03468861e-01 -3.36213127e-01 -4.51944201e-01
1.72372542e+00 -4.41497457e-01]
示例二,大于、小于、等于、大于等于等:
import numpy as np
arr = np.array([
[1,2,3],
[4,5,6],
[7,8,9]
])
print(arr[arr > 5])
print(arr[arr < 3])
print(arr[arr == 4])
print(arr[arr >= 7])
示例三,布尔运算组合用法(&是和,|是或):
import numpy as np
arr2 = np.array([
[[1,2,3],
[4,5,6],
[7,8,9]],
[[10,11,12],
[13,14,15],
[11,12,13]],
[[14,15,16],
[17,18,19],
[20,21,22]]
])
print(arr2[ (arr2>10) & (arr2<20)]) #[11 12 13 14 15 11 12 13 14 15 16 17 18 19]
print(arr2[ (arr2<5) | (arr2>20)]) #[ 1 2 3 4 21 22]
神奇索引
说明:用一个列表的各个值作为下标,进行数据索引。
示例:
import numpy as np
indexList = [6,1,3,0]
arr = np.arange(32).reshape((8,4))
print(arr[indexList])
说明:
arr生成一个维度为(8,4)的数组,使用indexList列表中的各个值去索引arr数组中对应的列表,以上为例,对索引为6,1,3,0的四个列表进行索引。