文章目录
五、索引
1.简单索引
1.1 一维数组
data = np.arange(100, step=10)
data
>>>
array([ 0, 10, 20, 30, 40, 50, 60, 70, 80, 90])
data[1:5]
>>>
array([10, 20, 30, 40])
data[4:]
>>>
array([40, 50, 60, 70, 80, 90])
data[:4]
>>>
array([ 0, 10, 20, 30])
1.2 二维数组
data = np.arange(16).reshape(4, 4)
data
>>>
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
data[1:3]
>>>
array([[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
data[1:]
>>>
array([[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
data[1:3, 1:3]
>>>
array([[ 5, 6],
[ 9, 10]])
data[:, 1:3]
>>>
array([[ 1, 2],
[ 5, 6],
[ 9, 10],
[13, 14]])
2.数组作为索引
data = np.arange(16).reshape(4,4)
data
>>>
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
data[[0, 2, 3], [1, 2, 3]]
>>>
array([ 1, 10, 15])
对应座标(0,1)(2,2)(3,3)
print (data[0,1], data[2,2], data[3,3])
>>>
1 10 15
xidx = np.array([0, 2, 3])
yidx = np.array([1, 2, 3])
data[xidx, yidx]
>>>
array([ 1, 10, 15])
# 修改每行里的特定列的数据
yidx = [0, 3, 2, 0]
data[np.arange(4), yidx] += 100
data
>>>
array([[100, 1, 2, 3],
[ 4, 5, 6, 107],
[ 8, 9, 110, 11],
[112, 13, 14, 15]])
3.bool 索引
data = np.arange(16).reshape(4,4)
data
>>>
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
idx = data >= 10
idx
>>>
array([[False, False, False, False],
[False, False, False, False],
[False, False, True, True],
[ True, True, True, True]], dtype=bool)
data[idx]
>>>
array([10, 11, 12, 13, 14, 15])
# 输出是元素线性化后的结果
data[data >= 10]
>>>
array([10, 11, 12, 13, 14, 15])
# 偶数元素
data[data % 2 == 0]
>>>
array([ 0, 2, 4, 6, 8, 10, 12, 14])
4.广播特性
a=np.array([[[1,2,3],[4,5,6]],[[1,2,3],[2,4,5]]])
a
>>>
array([[[1, 2, 3],
[4, 5, 6]],
[[1, 2, 3],
[2, 4, 5]]])
a + 2 #类似于上图1
>>>
array([[[3, 4, 5],
[6, 7, 8]],
[[3, 4, 5],
[4, 6, 7]]])
c = np.random.random((1,3))
c
a + c #维度(2,2,3)和(1,3)的array相加,基于广播特性,最后得到维度(2,2,3)的array
a+c
>>>
array([[[1.14365424, 2.62859846, 3.01655191],
[4.14365424, 5.62859846, 6.01655191]],
[[1.14365424, 2.62859846, 3.01655191],
[2.14365424, 4.62859846, 5.01655191]]])
六、合并与分割
1.合并
1.1 vstack,hstack
a=np.array([1,1,1])
b=np.array([2,2,2])
c=np.vstack((a,b))#上下合并
d=np.hstack((a,b))#左右合并
c
>>>
array([[1, 1, 1],
[2, 2, 2]])
d
>>>
array([1, 1, 1, 2, 2, 2])
1.2 concatenate
concatenate((a1, a2, …), axis=0) #数组拼接函数
- 参数:
a1,a2……
:为要拼接的数组
axis
:在哪个维度上进行拼接,默认为0
a=np.array([[1,1,1]])
b=np.array([[2,2,2]])
np.concatenate((a,b), axis=0)
>>>
array([[1, 1, 1],
[2, 2, 2]])
np.concatenate((a,b), axis=1)
>>>
array([[1, 1, 1, 2, 2, 2]])
1.3 增加维度
a.shape
>>>
(3,)
print(a[np.newaxis,:].shape)#行上加一个维度
>>>
(1, 3)
print(a[:,np.newaxis].shape)#纵向上加一个维度
>>>
(3, 1)
2.分割
2.1 split 平均分割
a=np.arange(12).reshape((3,4))
a
>>>
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
print(np.split(a,2,axis=1)) #纵向分割,平分成两个部分,不能不平均分割
>>>
[array([[0, 1],
[4, 5],
[8, 9]]), array([[ 2, 3],
[ 6, 7],
[10, 11]])]
2.2 array_split 不均等分割
print(np.array_split(a,3,axis=1))
>>>
[array([[0, 1],
[4, 5],
[8, 9]]), array([[ 2],
[ 6],
[10]]), array([[ 3],
[ 7],
[11]])]
2.3 vsplit,hsplit
print(np.vsplit(a,3) )#纵向分三块
>>>
[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]])]
print(np.hsplit(a,3) )#横向分三块
>>>
ValueError: array split does not result in an equal division
print(np.hsplit(a,3) )#横向分两块
>>>
[array([[0, 1],
[4, 5],
[8, 9]]), array([[ 2, 3],
[ 6, 7],
[10, 11]])]
七、拷贝
1.无拷贝
简单的复制操作不会产生对象的复制操作。
a=np.arange(4)
b=a
b.shape=(2,2)
a.shape
>>>
(2,2)
2. 浅拷贝
view操作,如numpy的slice,只会copy父对象,不会copy底层的数据,共用原始引用指向的对象数据。如果在view上修改数据,会直接反馈到原始对象。
a=np.arange(4)
b=a
b.shape=(2,2)
id(a)
>>>
2245541785648
c = a.view()#c的引用地址变化了
id(c)
>>>
2245541787408
c.shape =(2,2) #a.shape不变,但是修改c的数据会导致a的数据也会变化
a.shape
>>>
(4,)
c[0]=999
a
>>>
array([999, 999, 2, 3])
c
>>>
array([[999, 999],
[ 2, 3]])
3. 深拷贝
对对象及其子对象都进行copy一份,对新生成的对象修改删除操作不会影响到原对象。
a = np.arange(4)
b=a #对象复制,a,b地址一样
b.shape =(2,2)#a对象的shape也会变化
id(a),id(b)
>>>
(2245541788288, 2245541788288)
d = a.copy() #deep copy
id(d)
>>>
2245541848128
#对象修改删除操作不会影响到原对象
d[0]=9
d
>>>
array([[9, 9],
[2, 3]])
a
>>>
array([[0, 1],
[2, 3]])
摘自:https://blog.csdn.net/genghaihua/article/details/92806584