序列
副本与视图
- np.ndarray.copy()会对数据创建一个副本,直接的赋值语句不会创建副本,会实现共享。
切片
切片索引[start:stop:step],其中start省略,则取0,stop省略则取数组的最大索引值,step省略,则取1。若start/stop为负数(-2),则表示倒数第几(2)个。若step为负数,则表示逆向切片。
比如:x[0::2, 1::3] ,0::2表示对行切片,1::3表示对列切片
索引…的含义
- …替代许多:::构建完整的索引列表
eg:x为3维数组,x[…,1]=x[::,1]
整数数组索引
-
获取数据元素或进行元素修改:
二维数组中:x[2][1]=x[2,1] -
传入多个索引值时可获取多个元素值。
eg:x为一维数组,r=[0,2,-2] x[r]表示获取x数组的第一个,第三个和倒数第二个元素。
eg:x为二维数组,r=[0,1,2] c=[1,2,3]
x[r,c]表示取三个元素x[0,1] x[1,2] x[2,3]
import numpy as np
x=np.array([1,2,3,4,5,6,7,8])
r=np.array([[0,1],[3,4]])
print(x[r])
#[[1 2]
#[4 5]] r是二维数组,表示获取x数组的0,1,3,4号元素值
*由于r为二维数组,x[r]的维数就是>=2,而x[0]/x[1]/x[3]/x[4]为整数值,是数组的元素,故 得到的数组维数为2*
import numpy as np
x=np.array([[1,2,3,4,5],
[6,7,8,9,10],
[11,12,13,14,15],
[16,17,18,19,20],
[21,22,23,24,25]
])
r=np.array([[0,1],[3,4]])
print(x[r])
#[[[ 1 2 3 4 5]
# [ 6 7 8 9 10]]
#
# [[16 17 18 19 20]
# [21 22 23 24 25]]]
*r是二维数组,故x[r]的维数就是>=2,而x[0]/x[1]/x[3]/x[4]是一维数组,故 得到的数组维数为2+1=3,x[r]就是三维数组(2*2*5)*
r=np.array([[0,1],[3,4]]) #行索引
c=np.array([[0,1],[3,4]]) #列索引
print(x[r,c])
#[[ 1 7]
#[19 25]]
*r,c都是二维数组,故x[r,c]的维数>=2,而x[0][0],x[1][1],x[3][3],x[4][4]是元素值,故x[r,c]的维数是2维*
[r,c]可以为切片和数组的混合,进行数组的切片提取
x[0:3,[1,2,2]] #x为二维数组时表示取第0/1/2行的第1/2/2个元素
- np. take(arrayname,indices{r/[r,c]})表示对数组元素的提取。
-注意:切片索引生成的是原数组的子数组,共享。而整数数组索引是形成新数组。
布尔索引
- 使用布尔数组来索引目标数组
eg:x[x>5],其中,x>5会生成一个布尔数组,然后根据布尔值为真来取数组元素。
import numpy as np
x = np.array([np.nan, 1, 2, np.nan, 3, 4, 5])
y = np.logical_not(np.isnan(x)) #np.logical_not表示取反
print(x)
print(y)
print(x[y])
#[nan 1. 2. nan 3. 4. 5.]
#[False True True False True True True]
#[1. 2. 3. 4. 5.]
数组迭代
np.apply_along_axis(func1d, axis, arrayname)
axis=0时,表示竖着对元素使用func1d函数
axis=1时,表示横着对元素使用func1d函数
群里组长言:索引会降低维度,切片不会!