numpy——数组存取


1、常规办法:数组元素的存取方法和Python的标准方法相同
a = np.arange(10)
    #>>[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
 # # # 获取某个元素
print(a[3])
    #>> 3
 # # #  切片[3,6),左闭右开
print(a[3:6])
    #>> [3, 4, 5] 
 # # # 省略开始下标,表示从0开始
print a[:5]
    #>>[0, 1, 2, 3, 4]
 # # # 下标为负表示从后向前数
print( a[3:])
    #>>[3, 4, 5, 6, 7, 8, 9]
 # # # 步长为2
print a[1:9:2]
    #>>[1, 3, 5, 7]
 # # # 步长为-1,即翻转
print (a[::-1])
#>>[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
 # # # 切片数据是原数组的一个视图,与原数组共享内容空间,可以直接修改元素值
a[1:4] = 10, 20, 30
print( a)
#>>[ 0, 10, 20, 30,  4,  5,  6,  7,  8,  9]
 # # # 因此,在实践中,切实注意原始数据是否被破坏,如:
b = a[2:5]
b[0] = 200
print( a)
 #>>[  0  10 200  30   4   5   6   7   8   9]
2、整数/布尔数组存取
1)整型
  # 根据整数数组存取:当使用整数序列对数组元素进行存取时,将使用整数序列中的每个元素作为下标,整数序列可以是列表(list)或者数组(ndarray)。
  # 使用整数序列作为下标获得的数组不和原始数组共享数据空间。
    a = np.logspace(0, 9, 10, base=2)
    print (a)
    #>>[  1.,   2.,   4.,   8.,  16.,  32.,  64., 128., 256., 512.]

    i = np.arange(0, 10, 2)
    print i
    #>>[0, 2, 4, 6, 8]

# # # 利用i取a中的元素 b = a[i] print b # # b的元素更改,a中元素不受影响 b[2] = 1.6 print b #>>[ 1. , 4. , 1.6, 64. , 256. ] print a #>>[ 1., 2., 4., 8., 16., 32., 64., 128., 256., 512.]

2)布尔数

使用布尔数组i作为下标存取数组a中的元素:返回数组a中所有在数组b中对应下标为True的元素
# 生成10个满足[0,1)中均匀分布的随机数
a = np.random.rand(10)
print(a)
#>>array([0.18508752, 0.46099816, 0.80814244, 0.34301555, 0.92376581, 0.23402939, 0.74400314, 0.55217242, 0.46284303, 0.61656194])

# 大于0.5的元素索引
print(a > 0.5)
 #>>[False False True False True False True True False True]

# 大于0.5的元素
b = a[a > 0.5]
print(b)
#>>[0.80814244, 0.92376581, 0.74400314, 0.55217242, 0.61656194]

# 将原数组中大于0.5的元素截取成0.5
a[a > 0.5] = 0.5
#>>[0.18508752, 0.46099816, 0.5       , 0.34301555, 0.5       , 0.23402939, 0.5       , 0.5       , 0.46284303, 0.5       ]
# b不受影响

3) 二维数组的切片

    # [[ 0  1  2  3  4  5]
    #  [10 11 12 13 14 15]
    #  [20 21 22 23 24 25]
    #  [30 31 32 33 34 35]
    #  [40 41 42 43 44 45]
    #  [50 51 52 53 54 55]]
    a = np.arange(0, 60, 10)    # 行向量
    print (a)
    #>>[ 0, 10, 20, 30, 40, 50]

    b = a.reshape((-1, 1))      # 转换成列向量
    print (b)
    #>>[[ 0],
     #     [10],
     #     [20],
     #     [30],
     #     [40],
     #     [50]]

    c = np.arange(6)
    print(c)    #>>[0, 1, 2, 3, 4, 5]
    f = b + c   # 行 + 列
    print(f)     
  #>>  [[ 0,  1,  2,  3,  4,  5],
  #     [10, 11, 12, 13, 14, 15],
  #     [20, 21, 22, 23, 24, 25],
  #     [30, 31, 32, 33, 34, 35],
  #     [40, 41, 42, 43, 44, 45],
  #     [50, 51, 52, 53, 54, 55]]
    
# 合并上述代码
    a = np.arange(0, 60, 10).reshape((-1, 1)) + np.arange(6)
    print(a)
  #>>[[ 0,  1,  2,  3,  4,  5],
  #     [10, 11, 12, 13, 14, 15],
  #     [20, 21, 22, 23, 24, 25],
  #     [30, 31, 32, 33, 34, 35],
  #     [40, 41, 42, 43, 44, 45],
  #     [50, 51, 52, 53, 54, 55]]

    # 二维数组的切片
    print( a[(0,1,2,3), (2,3,4,5)] ) #>>[ 2, 13, 24, 35]
    print( a[3:, [0, 2, 5]])
    #>>[[30, 32, 35],
     #     [40, 42, 45],
     #     [50, 52, 55]]

    i = np.array([True, False, True, False, False, True])
    print( a[i])
# >> [[ 0,  1,  2,  3,  4,  5],
    #   [20, 21, 22, 23, 24, 25],
    #   [50, 51, 52, 53, 54, 55]]

    print( a[i, 3])
# >>[ 3, 23, 53]