numpy删除单行、删除单列、删除多列实现方式

 更新时间:2024年02月22日 10:30:53   作者:嗖100  
这篇文章主要介绍了numpy删除单行、删除单列、删除多列实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

numpy删除单行、删除单列、删除多列

import numpy as np

删除元素

通过index删除单行、删除单列、删除多行

def delFun():
    """
    删除
    :return:
    """
    source = np.array([[1, 2, 3], [1, 2, 3], [1, 2, 3]])

    # 删除第三行
    del_arr_1 = source.copy()
    del_row = np.delete(del_arr_1, 2, axis=0)

    # 删除第二列
    del_arr_2 = source.copy()
    del_col = np.delete(del_arr_2, 1, axis=1)

    # 删除第二、三行
    del_arr_3 = source.copy()
    del_mult_row = np.delete(del_arr_3, (1, 2), axis=0)

    print(del_row)
    print(del_col)
    print(del_mult_row)

原始数据

	[
		[1 2 3]
 		[1 2 3]
 		[1 2 3]
 	]

del_row 删除第三行 返回结果

	[
		[1 2 3]
 		[1 2 3]
 	]

del_col 删除第二列 返回结果

	[
		[1 3]
		 [1 3]
		 [1 3]
	]

del_mult_row 删除第二、三行 返回结果

	[
		[1 2 3]
	]

Numpy增加和删除元素

1. delete

numpy.delete(arr, obj, axis=None):

  • arr:类数组。操作对象
  • obj:切片、整数或者整数数组。指示要沿指定轴(由参数axis指定)删除的子数组的索引
  • axis:整数型,可选参数。指示删除子数组(由参数obj指定)所沿的轴
  • axis = None:arr会先按行展开,然后按照obj,删除第obj-1(从0开始)位置的数,返回一个展开的arr
>>> arr = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]])
>>> arr
array([[ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 9, 10, 11, 12]])

# obj参数
>>> np.delete(arr,1,1)
array([[ 1,  3,  4],
       [ 5,  7,  8],
       [ 9, 11, 12]])

>>> np.delete(arr,[1,2],axis=1)
array([[ 1,  4],
       [ 5,  8],
       [ 9, 12]])

# axis参数
>>> np.delete(arr,1,0)
array([[ 1,  2,  3,  4],
       [ 9, 10, 11, 12]])
       
>>> np.delete(arr,1)
array([ 1,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12])

2. insert

numpy.insert(arr, obj, values, axis=None):沿着给定的轴(axis),在给定的索引(obj)之前插入值

  • arr:类数组。操作对象
  • obj:切片、整数或者整数数组。指示插入values的位置索引(可以是单个索引也可以是多个索引),values插入在这些索引之前。
  • values:类数组。插入到arr中的值

如果values的数据类型和arr的数据类型不同,values会被自动转换为arr的数据类型

values的形状应使 arr[…,obj,…] = values 合法

  • axis:整数,可选参数。指示values沿着哪个轴插入

axis = None:arr会先被展平,类似numpy.delete函数

>>> arr = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]])
>>> arr
array([[ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 9, 10, 11, 12]])

# obj参数
>>> np.insert(arr,1,0,axis=1)
array([[ 1,  0,  2,  3,  4],
       [ 5,  0,  6,  7,  8],
       [ 9,  0, 10, 11, 12]])

>>> np.insert(arr,1,[1,2,3],axis=1) # values的形状应使 arr[...,obj,...] = values 合法
array([[ 1,  1,  2,  3,  4],
       [ 5,  2,  6,  7,  8],
       [ 9,  3, 10, 11, 12]])

>>> np.insert(arr,[1,2],np.array([[1,2],[3,4],[5,6]]),axis=1) # values的形状应使 arr[...,obj,...] = values 合法
array([[ 1,  1,  2,  2,  3,  4],
       [ 5,  3,  6,  4,  7,  8],
       [ 9,  5, 10,  6, 11, 12]])

>>> np.insert(arr,[1],[1,2,3],axis=1)
array([[ 1,  1,  2,  3,  2,  3,  4],
       [ 5,  1,  2,  3,  6,  7,  8],
       [ 9,  1,  2,  3, 10, 11, 12]])

# values参数
>>> np.insert(arr,1,[1.5,2,True],axis=1)
array([[ 1,  1,  2,  3,  4],
       [ 5,  2,  6,  7,  8],
       [ 9,  1, 10, 11, 12]])

# axis参数
>>> np.insert(arr,1,0,axis=0)
array([[ 1,  2,  3,  4],
       [ 0,  0,  0,  0],
       [ 5,  6,  7,  8],
       [ 9, 10, 11, 12]])

>>> np.insert(arr,1,0)
array([ 1,  0,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12])

注释:特别注意numpy.insert(obj = some_integer)与numpy.insert(obj = [some_integer])的区别。

3. append

numpy.append(arr, values, axis=None):添加值到数组的末尾

  • arr:类数组。操作对象
  • values:类数组 values的形状必须正确
  • axis:整数,可选参数。指示values沿着哪个轴添加到arr末尾
  • axis = None:arr会先被展平,类似numpy.delete和numpy.insert函数
>>> arr = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]])
>>> arr
array([[ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 9, 10, 11, 12]])

# values参数
>>> np.append(arr,[13,14,15,16],axis=0)
ValueError: all the input arrays must have same number of dimensions, but the array 
at index 0 has 2 dimension(s) and the array at index 1 has 1 dimension(s)

>>> np.append(arr,np.array([[13,14,15,16]]),axis=0)
array([[ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 9, 10, 11, 12],
       [13, 14, 15, 16]])

>>> np.append(arr,[5,9,13],axis=1)
ValueError: all the input arrays must have same number of dimensions, but the array 
at index 0 has 2 dimension(s) and the array at index 1 has 1 dimension(s)

>>> np.append(arr,np.array([[5],[9],[13]]),axis=1)
array([[ 1,  2,  3,  4,  5],
       [ 5,  6,  7,  8,  9],
       [ 9, 10, 11, 12, 13]])

# axis参数
>>> np.append(arr,[13,14,15,16])
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16])

注释: 特别注意values参数的形状。

4. resize

numpy.resize(a, new_shape):返回具有指定形状的新数组

  • a:类数组。操作对象
  • new_shape:整数或整数序列。调整大小后的数组的形状

如果新数组比原始数组大,那么新数组会用重复的原始数组来填充,这时会按照C语言的顺序重复遍历数组

>>> arr = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]])
>>> arr
array([[ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 9, 10, 11, 12]])

>>> np.resize(arr,(4,3))
array([[ 1,  2,  3],
       [ 4,  5,  6],
       [ 7,  8,  9],
       [10, 11, 12]])

>>> np.resize(arr,(4,4))
array([[ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 9, 10, 11, 12],
       [ 1,  2,  3,  4]])

>>> np.resize(arr,(3,5))
array([[ 1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10],
       [11, 12,  1,  2,  3]])

>>> np.resize(arr,(3,3))
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

注释:

numpy.resize没有单独考虑各个轴,因此其不适用于插值/外推。所以,numpy.resize不适用于调整图像或数据的大小,其中每个轴代表一个单独的不同实体。

numpy.resize和ndarray.resize的区别:

  • numpy.resize返回原始数据的副本,而ndarray.resize是对原始数据原地(in-place)修改
  • numpy.resize是用原始数组来填充,而ndarray是用0来填充
>>> arr = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]])
>>> arr
array([[ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 9, 10, 11, 12]])
       
>>> np.resize(arr,[3,5])
array([[ 1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10],
       [11, 12,  1,  2,  3]])
>>> arr
array([[ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 9, 10, 11, 12]])

>>> arr.resize(3,5,refcheck=False)
>>> arr
array([[ 1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10],
       [11, 12,  0,  0,  0]])```

numpy.resize和numpy.reshape的区别

  • numpy.resize中新数组的形状可以和原始数组不兼容,而numpy.reshape中新数组的形状必须和原始数组兼容
  • numpy.resize返回的是原始数组的副本,而numpy.reshape返回的是原始数组的视图 
>>> arr = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]])
>>> arr
array([[ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 9, 10, 11, 12]])
>>> id(arr)
2040077636592
>>> arr.ctypes.data
2039348516176

>>> arr_reshape = np.reshape(arr,(4,3))
>>> arr_reshape
array([[ 1,  2,  3],
       [ 4,  5,  6],
       [ 7,  8,  9],
       [10, 11, 12]])
>>> id(arr_reshape)
2040077636832
>>> arr_reshape.ctypes.data
2039348516176

>>> arr_resize = np.resize(arr,(4,3))
>>> arr_resize
array([[ 1,  2,  3],
       [ 4,  5,  6],
       [ 7,  8,  9],
       [10, 11, 12]])
>>> id(arr_resize)
2040077636752
>>> arr_resize.ctypes.data
2039348513616

>>> arr[0][0] = 0
>>> arr
array([[ 0,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 9, 10, 11, 12]])
>>> arr_reshape
array([[ 0,  2,  3],
       [ 4,  5,  6],
       [ 7,  8,  9],
       [10, 11, 12]])
>>> arr_resize
array([[ 1,  2,  3],
       [ 4,  5,  6],
       [ 7,  8,  9],
       [10, 11, 12]])

5. trim_zeros

numpy.trim_zeros(filt, trim=‘fb’):修剪一维数组或序列开头和/或尾部的0

filt:一维数组或序列

trim:字符串,可选参数

  • ‘f’:修剪一维数组或序列开头的0
  • ‘b’:修剪一维数组或序列尾部的0
  • ‘fb’:修剪一维数组或序列开头和尾部的0(默认值)
>>> arr = np.array([0, 0, 0, 1, 2, 3, 0, 2, 1, 0, 0])
>>> arr
array([0, 0, 0, 1, 2, 3, 0, 2, 1, 0, 0])

>>> np.trim_zeros(arr)
array([1, 2, 3, 0, 2, 1])
>>> np.trim_zeros(arr,trim='f')
array([1, 2, 3, 0, 2, 1, 0, 0])
>>> np.trim_zeros(arr,trim='b')
array([0, 0, 0, 1, 2, 3, 0, 2, 1])

>>> list1 = [0, 0, 0, 1, 2, 3, 0, 2, 1, 0, 0]
>>> np.trim_zeros(list1)
[1, 2, 3, 0, 2, 1]
>>> np.trim_zeros(list1,trim='f')
[1, 2, 3, 0, 2, 1, 0, 0]
>>> np.trim_zeros(list1,trim='b')
[0, 0, 0, 1, 2, 3, 0, 2, 1]

6. unique

numpy.unique(ar, return_index=False, return_inverse=False, return_counts=False, axis=None):查找数组唯一的元素,返回数组排序后的唯一的元素

参数:

  • ar:类数组
  • return_index:布尔值,可选参数
  • True:返回一个一维的数组unique_indices,其中每个元素表示每个排序后的唯一值在原始数组ar中的索引
  • return_inverse:布尔值,可选参数
  • True:返回一个一维的数组unique_inverse,其中每个元素表示原始数组ar中每个元素在返回的数组中的索引,用于重建原始数组
  • return_counts:布尔值,可选参数
  • True:返回一个一维的数组unique_counts,其中每个元素表示每个排序后的唯一值在原始数组中出现的次数
  • axis:整数或None,可选参数
  • None:原始数组ar会被展平

返回:

  • unique:ndarray对象,排序后的唯一值
  • unique_indices:ndarray对象(长度和unique一致),return_index为True时才返回
  • unique_inverse:ndarray对象(长度和展品后的原始数组一致),return_inverse为True时才返回
  • unique_counts:ndarray对象,return_counts为True时才返回
>>> arr = np.array([[1,2,3,4], [5,6,7,8], [5,6,7,8], [9,10,11,12]])
>>> arr
array([[ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 5,  6,  7,  8],
       [ 9, 10, 11, 12]])

>>> arr_unique, arr_index, arr_inverse, arr_counts = np.unique(arr, return_index=True, return_inverse=True, return_counts=True)
>>> arr_unique
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12])
>>> arr_index
array([ 0,  1,  2,  3,  4,  5,  6,  7, 12, 13, 14, 15], dtype=int64)
>>> arr_inverse
array([ 0,  1,  2,  3,  4,  5,  6,  7,  4,  5,  6,  7,  8,  9, 10, 11],
      dtype=int64)
>>> arr_counts
array([1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1], dtype=int64)

# unique = arr.flatten()[index]
>>> arr.flatten()[arr_index]
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12])

# arr = unique[inverse].reshape(arr.shape)
>>> arr_unique[arr_inverse].reshape(arr.shape)
array([[ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 5,  6,  7,  8],
       [ 9, 10, 11, 12]])

>>> arr_unique_0, arr_index_0, arr_inverse_0, arr_counts_0 = np.unique(arr, return_index=True, return_inverse=True, return_counts=True,axis=0)
>>> arr_unique_0
array([[ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 9, 10, 11, 12]])
>>> arr_index_0
array([0, 1, 3], dtype=int64)
>>> arr_inverse_0
array([0, 1, 1, 2], dtype=int64)
>>> arr_counts_0
array([1, 2, 1], dtype=int64)

>>> arr_unique_1, arr_index_1, arr_inverse_1, arr_counts_1 = np.unique(arr, return_index=True, return_inverse=True, return_counts=True,axis=1)
>>> arr_unique_1
array([[ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 5,  6,  7,  8],
       [ 9, 10, 11, 12]])
>>> arr_index_1
array([0, 1, 2, 3], dtype=int64)
>>> arr_inverse_1
array([0, 1, 2, 3], dtype=int64)
>>> arr_counts_1
array([1, 1, 1, 1], dtype=int64)

注释: 本篇中所有函数都会先对待操作数组进行拷贝,再进行操作。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Python使用Joblib模块实现加快任务处理速度

    Python使用Joblib模块实现加快任务处理速度

    在Python编程中,处理大规模数据或者进行复杂的计算任务时,通常需要考虑如何提高程序的运行效率,本文主要介绍了如何使用Joblib模块来加快任务处理速度,需要的可以参考下
    2024-03-03
  • Python turtle画图库&&画姓名实例

    Python turtle画图库&&画姓名实例

    今天小编就为大家分享一篇Python turtle画图库&&画姓名实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • 基于Python实现绘制属于你的世界地图

    基于Python实现绘制属于你的世界地图

    Python之所以这么流行,是因为它不仅能够应用于科技领域,还能用来做许多其他学科的研究工具,绘制地图便是其功能之一。本文我们将用matplot工具包之一的  mpl_toolkits  来绘制世界地图,需要的可以参考一下
    2022-11-11
  • python写完程序怎么运行的两种方式

    python写完程序怎么运行的两种方式

    这篇文章主要介绍了Python的两种运行方式,分别是命令行和交互式命令行,并详细讲解了如何在命令行和交互式命令行中运行Python代码,需要的朋友可以参考下
    2025-03-03
  • Python打包方法之setup.py与pyproject.toml的全面对比与实战

    Python打包方法之setup.py与pyproject.toml的全面对比与实战

    在 Python 开发中,创建可安装的包是分享代码的重要方式,本文将深入解析两种主流打包方法——setup.py 和 pyproject.toml,并通过一个实际项目示例,展示如何使用现代的 pyproject.toml 方法构建、测试和发布 Python 包,需要的朋友可以参考下
    2025-05-05
  • 使用Matplotlib制作动态图的示例详解

    使用Matplotlib制作动态图的示例详解

    matplotlib是一个著名的python绘图库,由于其灵活强大的绘图功能使得在python中可视化变得非常容易,本文主要介绍了在matplotlib库中制作动态图的方法,需要的可以参考一下
    2023-06-06
  • 使用Python和PyQt5实现全方面系统资源监控

    使用Python和PyQt5实现全方面系统资源监控

    这篇文章主要介绍了一个基于PyQt5和psutil库开发的系统资源监控工具,该工具不仅具有强大的系统监控功能,还采用了电影中经典的数字雨视觉效果作为背景,感兴趣的可以了解下
    2025-06-06
  • 浅谈python 线程池threadpool之实现

    浅谈python 线程池threadpool之实现

    这篇文章主要介绍了浅谈python 线程池threadpool之实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • Python中使用sklearn进行特征降维的方法

    Python中使用sklearn进行特征降维的方法

    在Python中,可以使用sklearn库中的特征降维方法对数据进行处理。主要包括基于PCA算法的降维、基于LDA算法的降维、以及利用特征选择方法进行降维。这些方法可以提高模型的训练效率和预测准确率,特别是在高维数据集中具有重要的作用
    2023-04-04
  • 如何将pytorch模型部署到安卓上的方法示例

    如何将pytorch模型部署到安卓上的方法示例

    这篇文章演示如何将训练好的pytorch模型部署到安卓设备上,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02

最新评论