2、ndarray数组的切片:
(1)数组切片的基本知识
各个维度上单独切片,用 “,” 隔开,用 “:”表示该维度所有的值。
数组切片获得的 新数组与原数据组共用一个 内存空间,切片数组更改数据原数组也会更改。
ndarray 的切片与列表方式切片有一些区别,尽量用数组方式。
import numpy as np
list1 = [
[ [1,2,3],
[3,2,1]],
[ [4,5,6],
[6,5,4]],
[ [7,8,9],
[9,8,7]]]
arr1 = np.array(list1)
(一)数组切片与列表方式切片的区别:
print(arr1[1,:,1:3])
数组切片:
[[5 6]
[5 4]]
print(arr1[1][:][1:3])
列表方式:
[[6 5 4]]
(二)数组切片用法:
切第二行的元素
print(arr1[1,:,:])
print(arr1[1])
print(arr1[1,:,1:3])
[[5 6]
[5 4]]
(2)切片数组赋值列表或数组:
赋值列表
import numpy as np
arr1 = np.random.randint(1,9,(3,4))
arr1[:,::2] = [100,100]
print(arr1)
[[100 6 100 2]
[100 6 100 1]
[100 3 100 5]]
赋值数组
import numpy as np
arr1 = np.random.randint(1,9,(3,12))
arr1[:,::2] = np.array([100,100,100,100,100,100])
print(arr1)
[[100 4 100 3 100 5 100 7 100 8 100 8]
[100 2 100 1 100 3 100 8 100 3 100 1]
[100 6 100 1 100 1 100 6 100 8 100 2]]
(3)花式索引:用整数数组进行索引。
注意 内部函数 .ix_( 索引数组1,索引数组2 ) 的用法。
也可用转置( .T )来取与 .ix_()方法一样的结果。
import numpy as np
arr1 = np.arange(1,31,1).reshape(6,5)
print(arr1)
# 获得第 2 4 5 行的所有元素
print(arr1[[1,3,4]])
# 注意这里取的是 (1,1) (3,2) (4,4) 四个元素
print(arr1[[1,3,4],[1,2,4]])
# 取得时是所有 第 2 4 5 行 与 1,2,4列的元素。 用 内部函数 np.ix_( 索引数组1,索引数组2 )
print(arr1[np.ix_([1,3,4],[1,2,4])])
# 也可以用转置 来取,与 np.ix_( )结果相同。
print(arr1[[1,3,4]].T[[1,2,4]].T)
(4)bool值数组索引:
利用布尔类型的数组进行数据索引,最终返回的结果是对应索引数组中数据为True位置的值。
实例用法:
①
求数组 数 > 5 的所有数。
import numpy as np
arr1 = np.arange(1,11,1).reshape(2,5)
# [[ 1 2 3 4 5]
# [ 6 7 8 9 10]]
print(arr1 > 5)
# [[False False False False False]
# [ True True True True True]]
print(arr1[arr1 > 5])
# [ 6 7 8 9 10]
②
names = np.array(['joe','tom','anne'])
scores = np.array([[70,80,90],
[77,88,91],
[80,90,70]])
classes = np.array(['语文','数学','英语'])
# 输出 joe 的成绩
bool_1 = names == 'joe'
print(bool_1) [ True False False]
print(scores[bool_1]) # [[70 80 90]]
# 输出joe的数学成绩
bool_2 = classes == '数学'
print(bool_2) [False True False]
print(scores[bool_1,bool_2]) # [80]
# 第三题
print(scores[(names == 'joe')|(names == 'anne')])
# [[70 80 90]
# [80 90 70]]
#第四题
print(scores[(names != 'joe') & (names != 'anne')]) # [[77 88 91]]
3、ndarray-数组转置与轴对换:
注意数组转置与 reshape()的区别。
数组转置的基本概念:
数组转置是指将shape进行重置操作,原始的shape值为:(2,3,4),转置后shape的值为:(4,3,2)。可以通过调用数组的 对象.transpose( ) 函数或者 对象.T 属性进行数组转置操作。
① 数组的转置:
import numpy as np
arr1 = np.arange(1,11,1).reshape(2,5)
1、 利用 T 属性
arr2 = arr1.T
print(arr2)
2、利用 transpose()函数
arr3 = arr1.transpose()
print(arr3)
② 数组的轴对换:
import numpy as np
arr1 = np.arange(1,13,1).reshape(2,3,2)
arr2 = arr1.transpose(2,0,1) 中间不用加小()
print(arr2)
[[[ 1 3 5]
[ 7 9 11]]
[[ 2 4 6]
[ 8 10 12]]]
运行过程:
4、ndarray-数组拉伸与合并:
①数组的拉伸:np.tile(A,rep),可以将数组A进行拉伸,沿着A的维度重复rep次
例子:
import numpy as np
arr1 = np.array([[1,2,3],
[4,5,6]])
print(np.tile(arr1,3)) # 一个数字为 横向拉伸 3 倍
print(np.tile(arr1,(3,1))) # 纵向 拉伸 3倍 ,横向拉伸 1倍
② 数组的合并:np.stack()函数
对于ndarray数组而言,多个数组可以执行合并操作,合并的方式有多种:
- Stack(arrays,axis=0):沿着新的轴加入一个维度 ( axis是坐标轴 ,stack 堆 )
- vstack():堆栈数组垂直顺序(行)
- hstack():堆栈数组水平顺序(列)。
- stack()函数内部要加 小 ()。
-
import numpy as np a = np.array([[1,2,3], [4,5,6]]) b = np.array([[1,2,3], [4,5,6]]) c = np.array([[1,2,3], [4,5,6]]) d = np.array([[1,2,3], [4,5,6]]) e = np.array([1,2,3]) f = np.array([4,5,6]) print(np.stack((e,))) # 注意 : stack 里面要用小()括起来,默认 axis 为 0 轴。 print(np.stack((e,),axis=1)) print(np.stack((e,f),axis=1))
5、ndarray-通用函数/常用函数:(元素级运算)
ufunc:接受一个或多个标量值,进行快速元素级运算的函数,主要包括一元函数和二元函数。
①一元 ufunc:元素级操作,调用方法: np . 函数名()。
例子:
② 二元ufunc :(元素级操作,其中dot 不是元素级操作)
数组的 点积 不同于 数组 * 数组 。
6、聚合函数:
arr1 =np.random.randint(1,11,(3,4))
print(np.max(arr1)) # 求最大值
print(np.min(arr1))
print(np.mean(arr1)) # 平均值
print(arr1.mean()) # 平均值
方差:np.array( ) 、标准差:np.std( )
聚合函数对 某一轴元素进行 聚合:
7、np. where()函数(三元表达式x if condition else y效果):
np.where(condition,arr1,arr2) 满足条件 选择arr1,不满足 选择arr2
用法:
8、去重函数 np.unique(对象):