這是Numpy學習系列第二部分溯香,第一部分見Numpy-1
4. Array對象的存取
4.1 Array的Indexing,Slicing惠呼,Iterating
該部分集中在Numpy的array數(shù)據(jù)的存取滋早,類似與pyhton的list的索引、切片等
>>>import numpy as np
>>>a = np.arange(8)
>>>a, a[0], a[5]
(array([0, 1, 2, 3, 4, 5, 6, 7]), 0, 5)
>>>a[1:5]
array([1, 2, 3, 4])
>>>a[:-1]
array([0, 1, 2, 3, 4, 5, 6])
>>>a[::-1]
array([7, 6, 5, 4, 3, 2, 1, 0])
>>>a[5:1:-2]
array([5, 3])
>>>a[::3] = -100
>>>a
array([-100, 1, 2, -100, 4, 5, -100, 7])
>>># iterat考婴, Array對象也支持迭代協(xié)議
>>>for i in a:
... print(i * (1/3.))
-33.3333333333
0.333333333333
0.666666666667
-33.3333333333
1.33333333333
1.66666666667
-33.3333333333
2.33333333333
4.2 數(shù)據(jù)共享
與Python的list不同的是:通過下標贩虾、切片獲取的新Array是和原Array共用一個數(shù)據(jù)空間,相當于引用.
>>>b = a[3:7]
>>>b
array([-100, 4, 5, -100])
>>>b[0] = 1
>>>a, b # a[3] <= b[0], a[3]=1
(array([-100, 1, 2, 1, 4, 5, -100, 7]),
array([ 1, 4, 5, -100]))
4.3 使用整數(shù)序列
Numpy除了可以使用類似Python的list方法獲取元素外沥阱,還提供了整數(shù)序列和布爾數(shù)組獲取元素. 它們均不與原Array共享數(shù)據(jù)空間.
使用整數(shù)序列時缎罢,將使用整數(shù)序列中的每個元素作為下標,整數(shù)序列可以使列表或數(shù)組.
>>># 獲取a中下標為 0,1,1,0的元素考杉,組成一個新Array策精,下標可以是負數(shù)
>>>a[[0, 1, 1, 0]], a[np.array([0, 1, 1, -1])]
(array([-100, 1, 1, -100]), array([-100, 1, 1, 7]))
>>>a[[0, 1]] = 10, 11 # 修改元素的值
>>>a
array([ 10, 11, 2, 1, 4, 5, -100, 7])
>>># a, b 不共享數(shù)據(jù)空間,修改b元素值并沒有修改a的元素值
>>>b = a[[0, 1]]
>>>b[0] = 10000
>>>a, b
(array([ 10, 11, 2, 1, 4, 5, -100, 7]),
array([10000, 11]))
4.4 使用布爾數(shù)組
使用布爾數(shù)組作為下標獲取新Array時奔则,將布爾數(shù)組對應的下標為True的元素構成新Array. 注意兩點:1. 不共享數(shù)據(jù)空間蛮寂, 2. 只能使用布爾數(shù)組,不能使用布爾列表
>>># 注意以下兩種的不同易茬, list*2 相當于2個list相加酬蹋,元素數(shù)為原來2倍及老,
>>># array*2則為array的乘法計算,為數(shù)據(jù)乘法計算范抓,原始數(shù)相同骄恶,按整數(shù)數(shù)組取值
>>>a[np.array([True, False, True, False]*2)]
array([ 10, 2, 4, -100])
>>>a[np.array([True, False, True, False])*2]
array([ 2, 10, 2, 10])
>>># array數(shù)值計算,元素數(shù)相同匕垫,True實際數(shù)值為1,False為0
>>>np.array([True, False, True, False])*2
array([2, 0, 2, 0])
>>># 布爾數(shù)組修改元素
>>>a[np.array([True, False]*4)] = -1
>>>a
array([-1, 11, -1, 1, -1, 5, -1, 7])
布爾數(shù)組一般通過布爾運算獲得的僧鲁,如:
>>>a>2
array([False, True, False, False, False, True, False, True], dtype=bool)
>>>a, a[a>2]
(array([-1, 11, -1, 1, -1, 5, -1, 7]), array([11, 5, 7]))
這里僅集中在一維數(shù)組,下篇將涉及到多維數(shù)組的操作. 不過象泵,對數(shù)組的存取方法以及共享情況都是一致的寞秃,特別是類似Python的list的切片等操作是共享數(shù)據(jù)空間(與list操作不同),整數(shù)序列和布爾數(shù)組的操作是不共享的.