「numpy」ndarray 数组基本操作

4 阅读3分钟

numpy ndarray 数组操作

【目录】

  • 数组的索引、切片
  • 数组的操作

一、数组的索引、切片(适用于所有序列容器)

  • 语法: 序列 [ 起始下标:结束下标:步长 ]

1.1 索引、切片技巧

  • [] 内的数字都可以是负的,表示"逆序",必须保证合法的组合才行。
  • 默认的步长是1,可以省略:。步长取法:起始下标 + n * 步长(n = 0,1,2,3,…)
  • 得到的结果区间为:[起始下标, 结束下标)。左闭右开
  • 起始下标和结束下标有 ":",两者中间必须有 ":",省略起始或者结束下标,表示从头开始或者到最后结束
  • 多维数组序列切片:"先行后列,逗号隔开"
  • [:, [1]] 表示选择第一列的内容
 x = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]])   # 3 x 4 的数组矩阵
 print(x[:-1:2])     # 表示索引是从0到结尾[10, 11, 12],步长是2。但是返回的区间是左闭右开的规则
 ​
 # 返回结果
 [[1 2 3]
  [7 8 9]]
 print(x[:, [1]])    # 选择第1列的内容
 ​
 # 返回结果
 [[ 2]
  [ 5]
  [ 8]
  [11]]
 # 三维
 a1 = np.array([ [[1,2,3],[4,5,6]], [[12,3,34],[5,6,7]]])
 ​
 # 返回结果
 array([[[ 1,  2,  3],
         [ 4,  5,  6]],
 ​
        [[12,  3, 34],
         [ 5,  6,  7]]])
 ​
 # 索引、切片
 a1[0, 0, 1]   # 输出: 2

二、数组的操作

2.1 形状修改

  • ndarray.reshape(shape, order)
  • 返回一个新的数组对象,不改变原来的数组
 x = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]])   # 4 x 3 的数组矩阵
 ​
 x.reshape([-1, 6])  # 数组的形状被改为(2,6),-1表示通过待计算
 ​
 print(x.reshape([2, 6]))
 # 返回结果
 [[ 1  2  3  4  5  6]
  [ 7  8  9 10 11 12]]

  • ndarray.resize(new_shape)
  • 修改数组本身的形状
 x = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]])   # 4 x 3 的数组矩阵
 x.resize([3, 4])
 print(x)
 ​
 # 返回结果 3 x 4 的数组矩阵
 [[ 1  2  3  4]
  [ 5  6  7  8]
  [ 9 10 11 12]]

  • ndarray.T
  • 数组转置
 x = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]])   # 3 x 3 的数组矩阵
 x.resize([2, 6])
 print(x.T)
 ​
 # 返回结果
 [[ 1  7]
  [ 2  8]
  [ 3  9]
  [ 4 10]
  [ 5 11]
  [ 6 12]]

2.2 类型修改

  • ndarray.astype(type)

  • 返回新的数组对象,原数组不改变
 x = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]])   # 3 x 3 的数组矩阵
 x.resize([2, 6])
 print(x.astype(str))
 ​
 # 返回结果
 [['1' '2' '3' '4' '5' '6']
  ['7' '8' '9' '10' '11' '12']]

  • ndarray.tobytes ( [order] )
  • 构造包含数组中原始数据字节的Python字节
 arr = np.array([1, 2, 3])
 print(arr.tobytes())
 print(arr.dtype)
 ​
 # 返回结果
 b'\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00'
 int64 --64个bit也就是8字节

2.3 数组去重

  • numpy.unique(arr, return_index, return_inverse, return_counts)

  • 去除arr中的重复元素,并且返回一个新的升序的数组

    • arr:输入数组,如果不是一维数组则会展开
    • return_index:如果为 true,返回新列表元素在旧列表中的位置(下标),并以列表形式存储。
    • return_inverse:如果为true,返回旧列表元素在新列表中的位置(下标),并以列表形式存储。
    • return_counts:如果为 true,返回去重数组中的元素在原数组中的出现次数。
 tmp = np.array([1, 3, 3, 2, 2, 5, 6])
 print(np.unique(tmp))
 ​
 # 返回结果
 [1 2 3 5 6]