Pythonnumpy数组元素的访问及数组的增删改查功能详解

作者:

文章目录
  • 🌺 ndarray 切片操作的基本语法和列表类似,为 arr[start:stop:step],其中 star、stop 和 step 是可选参数。 🌺 对于多维数组,每个维度都可以单独指定切片范围,语法为 arr[dim1_start:dim1_stop:dim1_step, dim2_start:dim2_stop:dim2_step, …]。 🌺 start:切片起始索引,包含该索引对应的元素,默认值为 0。负数索引表示从数组末尾开始计数。 🌺 stop:切片结束索引,不包含该索引对应的元素,默认值为数组的长度。负数索引表示从数组末尾开始计数。 🌺 step:切片步长,默认值为 1。正数表示从左到右选取元素,负数表示从右到左选取元素。 🌺 得到的结果仍是ndarray。
  • 目录
    • numpy ndarray数组元素的访问及数组的增删改查
    • ndarray数组元素的访问
      • 一维ndarray的元素访问
      • 二维ndarray的元素访问
    • ndarray数组元素的增删改查
      • ndarray数组元素的增加 np.append
      • np.insert
      • np.hstack和np.vstack
    • ndarray数组元素的删除
      • np.delete()删除指定位置的元素
      • 根据条件删除元素(过滤)
      • np.unique删除重复元素
    • 修改ndarray中的元素
      • 直接索引赋值
      • 切片赋值
      • 布尔索引赋值
      • 使用 np.put() 按索引批量赋值
      • 使用 np.where() 条件替换
      • 修改为特殊值
      • numpy中的裁剪函数Clip

    • 🌺 ndarray 切片操作的基本语法和列表类似,为 arr[start:stop:step],其中 star、stop 和 step 是可选参数。
    • 🌺 对于多维数组,每个维度都可以单独指定切片范围,语法为 arr[dim1_start:dim1_stop:dim1_step, dim2_start:dim2_stop:dim2_step, …]。
    • 🌺 start:切片起始索引,包含该索引对应的元素,默认值为 0。负数索引表示从数组末尾开始计数。
    • 🌺 stop:切片结束索引,不包含该索引对应的元素,默认值为数组的长度。负数索引表示从数组末尾开始计数。
    • 🌺 step:切片步长,默认值为 1。正数表示从左到右选取元素,负数表示从右到左选取元素。
    • 🌺 得到的结果仍是ndarray。

    🍁 0个冒号的,stop

    code:
    import numpy as np
    nd1 = np.array(range(8))
    print("nd1[3]: %d, nd1[-2]: %d" % (nd1[3], nd1[-2]))
    result:
    nd1[3]: 3, nd1[-2]: 6

    🍁 1个冒号的,start and stop

    code:
    import numpy as np
    nd1 = np.array(range(8))
    print("nd1[:3]: %s, nd1[2:4]: %s, nd1[4:]: %s, nd1[:]: %s" % (nd1[:3], nd1[2:4], nd1[4:], nd1[:]))
    result:
    nd1[:3]: [0 1 2], nd1[2:4]: [2 3], nd1[4:]: [4 5 6 7], nd1[:]: [0 1 2 3 4 5 6 7]

    🍁 2个冒号的,start,stop,step

    code:
    import numpy as np
    nd1 = np.array(range(8))
    import numpy as np
    nd1 = np.array(range(8))
    print("nd1[::3]: %s, nd1[2::4]: %s, nd1[:4:]: %s, nd1[:6:2]: %s,"% (nd1[::3], nd1[2::4], nd1[:4:], nd1[:6:2]))
    print("nd1[2:5:]: %s,  nd1[1::]: %s, nd1[1:7:3]: %s, nd1[::]: %s" % (nd1[2:5:],  nd1[1::], nd1[1:7:3], nd1[::]))
    result:
    nd1[::3]: [0 3 6], nd1[2::4]: [2 6], nd1[:4:]: [0 1 2 3], nd1[:6:2]: [0 2 4],
    nd1[2:5:]: [2 3 4],  nd1[1::]: [1 2 3 4 5 6 7], nd1[1:7:3]: [1 4], nd1[::]: [0 1 2 3 4 5 6 7]

    🌹访问单个元素,[行,列]指明要访问的元素的行列

    code:
    import numpy as np
    nd1 = np.array([[1, 2, 3], [4, 5, 6]])
    print("nd1[1,2]: %s" % nd1[1, 2])
    result:
    nd1[1,2]: 6
    • 🌹[]访问一行或者多行
    • 🌹[]中一个数指行,有逗号,逗号前指行,后指列
    • 🌹行和列分别可以用切片,列表标识多行或者多列
    code:
    import numpy as np
    nd1 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
    print("nd1[1]: %s", nd1[1])  # 一个参数指行
    print("nd1[1, :]", nd1[1, :])  # 用中间逗号的方式指定行和列
    print("nd1[0:2, :]", nd1[0:2, :])  # 用切片的方式指定多行
    print("nd1[[0,1], :]", nd1[0:2, :])  # 用列表的方式指定多行
    result:
    nd1[1]: [4 5 6]
    nd1[1, :]: [4 5 6]
    nd1[0:2, :]: [[1 2 3]
     [4 5 6]]
    nd1[[0,1], :]: [[1 2 3]
     [4 5 6]]
    • 🌹访问一列或者多列
    • 🌹访问某一列[:, 列号]
    • 🌹访问某一列[:, 切片或者列表]访问多列
    code:
    import numpy as np
    nd1 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
    print("nd1[:, :]:", nd1[:, :])  # 所有行, 所有列
    print("nd1[:, 1]:", nd1[:, 1])  # 第1列
    print("nd1[1, 0:2]:", nd1[1, 0:2])  # 第一行的0列和1列
    print("nd1[[0,1], [0, 2]]:", nd1[[0, 1], [0, 2]])  # 第一行的0列和1列
    result:
    nd1[:, :]: [[1 2 3]
     [4 5 6]
     [7 8 9]]
    nd1[:, 1]: [2 5 8]
    nd1[1, 0:2]: [4 5]
    nd1[[0,1], [0, 2]]: [1 6]

    -🌻np.append(arr, values, axis=None),values为要添加的数组,注意要和arr的shape匹配才能添加。

    🌻生成新的数据,原数据不变,values为要添加的数组,注意要和arr的shape匹配才能添加。

    code:
    import numpy as np
    nd1 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
    nd2 = [[11, 22, 33]]  # 上下方向添加, 要是一行数据的形式
    nd3 = [[44, 444], [55, 555], [66, 666]]
    new_nd1 = np.append(nd1, nd2, axis=0)  # 上下方向添加
    print(new_nd1)
    new_nd2 = np.append(nd1, nd3, axis=1)  # 左右方向添加
    print(new_nd2)
    result:
    [[ 1  2  3]
     [ 4  5  6]
     [ 7  8  9]
     [11 22 33]]
    [[  1   2   3  44 444]
     [  4   5   6  55 555]
     [  7   8   9  66 666]]

    -🌻 np.insert() 函数可以在数组的指定位置插入值,返回一个新的数组。
    -🌻 np.insert(arr, obj, values, axis=None)

    code:
    import numpy as np
    nd1 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
    # insert(arr, obj, values, axis=None)
    nd2 = np.insert(nd1, 1, [11, 22, 33], axis=0)
    nd3 = np.insert(nd2, 3, [[44, 55, 66]], axis=0)
    nd4 = np.insert(nd1, 1, [11, 22, 33], axis=1)
    nd5 = np.insert(nd4, 3, [[44, 55, 66]], axis=1)
    print("nd3:n", nd3)
    print("nd5:n", nd5)
    result:
    nd3:
     [[ 1  2  3]
     [11 22 33]
     [ 4  5  6]
     [44 55 66]
     [ 7  8  9]]
    nd5:
     [[ 1 11  2 44  3]
     [ 4 22  5 55  6]
     [ 7 33  8 66  9]]

    np.concatenate

    • 🪻 np.concatenate() 函数可以将多个数组沿着指定的轴连接在一起,实现数据的合并。
    • 🪻返回一个新的数组,原数组不会被修改。
    code:
    import numpy as np
    # 一维数组拼接
    arr_1d_1 = np.array([1, 2, 3])
    arr_1d_2 = np.array([4, 5, 6])
    new_arr_1d = np.concatenate((arr_1d_1, arr_1d_2))  # 一维数字组拼接不用指定axis
    print("一维数组拼接后的结果:", new_arr_1d)
    # 二维数组拼接
    arr_2d_1 = np.array([[1, 2], [3, 4]])
    arr_2d_2 = np.array([[5, 6], [7, 8]])
    # 垂直拼接
    new_arr_2d_vertical = np.concatenate((arr_2d_1, arr_2d_2), axis=0)  # 垂直方向上拼接
    print("n二维数组垂直拼接后的结果:")
    print(new_arr_2d_vertical)
    # 水平拼接
    new_arr_2d_horizontal = np.concatenate((arr_2d_1, arr_2d_2), axis=1)  # 水平方向上拼接
    print("n二维数组水平拼接后的结果:")
    print(new_arr_2d_horizontal)
    result:
    一维数组拼接后的结果: [1 2 3 4 5 6]
    二维数组垂直拼接后的结果:
    [[1 2]
     [3 4]
     [5 6]
     [7 8]]
    二维数组水平拼接后的结果:
    [[1 2 5 6]
     [3 4 7 8]]

    • ☘️ np.hstack(tup1,tup2,…),注意参数的类型。
    • ☘️ 参数tup是一个元组、列表或其他可迭代对象,其中包含了要进行水平拼接的多个数组。
    • ☘️ np.vstack(tup1,tup2),和np.hstack不同的是拼接的方向不同。
    code:
    import numpy as np
    nd1 = np.array([[1, 2], [3, 4], [5, 6]])
    nd2 = np.array([[11, 22], [33, 44], [55, 66]])
    print("hstack: ", np.hstack((nd1, nd2)))
    print("vstack: ", np.vstack((nd1, nd2)))
    result:
    hstack:  [[ 1  2 11 22]
     [ 3  4 33 44]
     [ 5  6 55 66]]
    vstack:  [[ 1  2]
     [ 3  4]
     [ 5  6]
     [11 22]
     [33 44]
     [55 66]]

    -🪻 NumPy 数组是固定大小的,直接删除元素通常会创建一个新数组。
    -🪻 删除一维数组元素,np.delete(arr1, idx),指定位置为idx。
    -🪻 删除二维数组元素,np.delete(arr1, idx, axis=0/1),指定位置为idx,按行或者列要指定axis。

    code:
    import numpy as np
    arr1 = np.array(range(5))
    arr2 = np.delete(arr1, [0,4])
    arr3 = np.delete(arr1, 2)
    print(arr1)
    print(arr2)
    print(arr3)
    result:
    import numpy as np
    arr1 = np.array(range(5))
    arr2 = np.delete(arr1, [0,4])
    arr3 = np.delete(arr1, 2)
    print(arr1)
    print(arr2)
    print(arr3)
    code:
    arr1 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
    arr2 = np.delete(arr1, 1, axis=0)  # 删除第2行(索引1)
    arr3 = np.delete(arr1, [1,2], axis=0)  # 删除第2行(索引1)
    print("arr1:n",arr1)
    print("arr2:n",arr2)
    print("arr3:n",arr3)
    result:
    arr1:
     [[1 2 3]
     [4 5 6]
     [7 8 9]]
    arr2:
     [[1 2 3]
     [7 8 9]]
    arr3:
     [[1 2 3]]

    • 🍅 使用布尔索引创建符合条件的新数组
    • 🍅 类似于(arr1>1) & (arr1<5)的表达式生成一个布尔数组。
    code:
    import numpy as np
    arr1 = np.array([1, 2, 3, 4, 5, 6])
    condition = (arr1>1) & (arr1<5)
    arr2 = arr1[condition]
    print("arr1n", arr1)
    print(condition)
    print("arr2n", arr2)
    result:
    arr1
     [1 2 3 4 5 6]
    [False  True  True  True False False]
    arr2
     [2 3 4]

    🍉 删除重复元素,并重新排序

    code:
    import numpy as np
    arr = np.array([1, 2, 2, 3, 3, 3, 5, 5, 4, 4])
    unique_arr = np.unique(arr)
    print(type(unique_arr), unique_arr)
    result:
    <class 'numpy.ndarray'> [1 2 3 4 5]

    💖 支持一维和多维

    code:
    import numpy as np
    arr1 = np.array([10, 20, 30, 40])
    arr1[2] = 300
    arr1[-1] = 400
    print("arr1:n", arr1)
    arr2 = np.array([[1, 2], [3, 4]])
    arr2[0, 1] = 20
    print("arr2:n", arr2)
    result:
    arr1:
     [ 10  20 300 400]
    arr2:
     [[ 1 20]
     [ 3  4]]

    • 💖 通过切片选择多个元素,批量修改值。
    • 💖 赋值时需要确保右侧值的形状与切片形状兼容。
    code:
    import numpy as np
    arr1 = np.array([1, 2, 3, 4, 5])
    arr1[1:4] = [20, 30, 40]
    print("arr1:n", arr1)
    arr2 = np.array([1, 2, 3, 4, 5])
    arr2[1:4] = 0  # 赋值为同一个数
    print("arr2:n", arr2)
    arr3 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
    arr3[:, 2] = [20, 50, 80]  # 修改第2列
    print("arr3:n", arr3)
    result:
    arr1:
     [ 1 20 30 40  5]
    arr2:
     [1 0 0 0 5]
    arr3:
     [[ 1  2 20]
     [ 4  5 50]
     [ 7  8 80]]

    💞 通过布尔掩码选择符合条件的元素,批量修改。

    code:
    import numpy as np
    arr1 = np.array([1, 2, 6, 4, 10, 5, 8])
    arr1[(arr1 > 3) & (arr1 < 8) ] = 0
    print("arr1:n", arr1)
    result:
    arr1:
     [ 1  2  0  0 10  0  8]

    -💘 np.put(arr, [索引],[对应索引的修改值])

    code:
    import numpy as np
    arr = np.array([10, 20, 30, 40, 50])
    np.put(arr, [0, 2, 4], [100, 300, 500])  # 修改索引0、2、4的元素
    print(arr)
    result:
    [100  20 300  40 500]

    -☘️ np.where(condition),返回满足条件的元素的索引。

    code:
    import numpy as np
    arr1 = np.array([1, 2, 3, 4, 5, 6])
    indices = np.where(arr1 > 3)
    print("indices:n", indices)
    print("arr1[indices]:n", arr1[indices])
    # np.where对于二维数组, 返回的是行索引和列索引列表, 满足条件的是2, 3,4这两个元素, 即为
    # arr2[0,1], arr2[1,0], arr2[1,1],它们行索引形成[0,1,1], 列索引形成[1,0,1]
    arr2 = np.array([[1, 2], [3, 4]])
    row_idx, col_idx = np.where(arr2 > 1)
    print(f"row_idx:{row_idx}, col_idx: {col_idx}")
    result:
    indices:
     (array([3, 4, 5], dtype=int64),)
    arr1[indices]:
     [4 5 6]
    row_idx:[0 1 1], col_idx: [1 0 1]
    • -☘️ np.where(condition, x, y),当 condition 为 True 时,取 x 的值,否则取y的值。
    • -☘️ 算是3目运算符。
    code:
    import numpy as np
    dt = np.dtype([
        ('name', 'U3'),  # Unicode字符串,最大长度3
        ('age', np.int32),
        ('height', float)
    ])
    arr = np.array([
        ('Alice', 25, 1.65),
        ('Bob', 30, 1.80),
        ('Charlie', 22, 1.75)
    ], dtype=dt)
    print(arr)
    print(arr[0]["name"])
    print(arr["age"])
    result:
    [('Ali', 25, 1.65) ('Bob', 30, 1.8 ) ('Cha', 22, 1.75)]
    Ali
    [25 30 22]

    • 🏵️ 如果要赋值为nan,必须dtarray为float型,先要进行数据类型的转换。

    • 🌺Clip函数用于将数组中的元素限制在指定的最小值和最大值之间。
    • 🌺 np.clip(arr, a_min, a_max, out=None), arr:输入的数组。a_min:最小值(低于此值的元素将被替换为 a_min, a_max:最大值(高于此值的元素将被替换为 a_max)。
    • out(可选):指定输出结果的数组,如果指定为arr,相当于原地修改,若不提供则返回新数组。
    code:
    import numpy as np
    arr2d = np.array([[1, 5], [10, 15]])
    clipped = np.clip(arr2d, 3, 12, out=arr2d)
    print(clipped)
    print(arr2d)
    result:
    [[ 3  5]
     [10 12]]
    [[ 3  5]
     [10 12]]

    到此这篇关于Python numpy数组元素的访问及数组的增删改查的文章就介绍到这了,更多相关Python numpy数组元素增删改查内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!

    您可能感兴趣的文章:

    • python numpy.power()数组元素求n次方案例
    • python如何获得list或numpy数组中最大元素对应的索引
    • Python替换NumPy数组中大于某个值的所有元素实例
    • 讲解Python3中NumPy数组寻找特定元素下标的两种方法
    • Python numpy.array()生成相同元素数组的示例

    站内搜索