博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NumPy 学习笔记(三)
阅读量:4949 次
发布时间:2019-06-11

本文共 7175 字,大约阅读时间需要 23 分钟。

NumPy 数组操作:

  1、修改数组形状

    a、numpy.reshape(arr, newshape, order='C') 在不改变数据的条件下修改形状

    b、numpy.ndarray.flat 是一个数组元素迭代器

    c、numpy.ndarray.flatten(self, order) 返回一份数组拷贝,对拷贝数组修改不会影响原数组

    d、numpy.ravel(a, order='C') 展开数组元素,顺序通常是 "C 风格",返回的是数组视图,即修改会影响原始数组

import numpy as np# 将 1 维数组改变为形状为 2*5 的数组arr = np.arange(10).reshape(2, 5)print("arr: ", arr)for elem in arr.flat:    elem = elem + 1    print(elem, end=" ")        # 1 2...10# 原数组未改变!!!print("\narr: ", arr)arr.shape = (5, 2)# [0 1 2 3 4 5 6 7 8 9]print("Order is C: ", arr.flatten())# [0 2 4 6 8 1 3 5 7 9]print("Order is F: ", arr.flatten(order="F"))temp = arr.ravel()print("arr: ", temp)# 修改了展开数组下标为 2 的元素arr.ravel()[2] = 10print("arr: ", arr)     # arr 发生改变

 

  2、翻转数组

    a、numpy.transpose(arr, axes) 用于对换数组的维度

    b、numpy.ndarray.T 类似 numpy.transpose()

    c、numpy.rollaxis(arr, axis, start) 向后滚动特定的轴到一个特定位置

    d、numpy.swapaxes(arr, axis1, axis2) 用于交换数组的两个轴

import numpy as np# numpy.transpose(arr, axes) 用于对换数组的维度arr = np.arange(1, 11).reshape(5, 2)print("transpose arr: ", np.transpose(arr))# numpy.ndarray.T 类似 numpy.transpose()print("arr.T: ", arr.T)# numpy.rollaxis(arr, axis, start) 向后滚动特定的轴到一个特定位置arr = np.arange(4).reshape(2, 2)print("rollaxis arr: ", np.rollaxis(arr, axis=1))       # [[0 2] [1 3]]# numpy.swapaxes(arr, axis1, axis2) 用于交换数组的两个轴print("swapaxes arr: ", np.swapaxes(arr, 1, 0))     # [[0 2] [1 3]]

 

  3、修改数组维度

    a、numpy.broadcast 用于模仿广播的对象,它返回一个对象,该对象封装了将一个数组广播到另一个数组的结果

    b、numpy.broadcast_to(array, shape, subok=False) 函数将数组广播到新形状。它在原始数组上返回只读视图,通常不连续。 如果新形状不符合 NumPy 的广播规则,该函数可能会抛出ValueError

    c、numpy.expand_dims(arr, axis) 通过在指定位置插入新的轴来扩展数组形状

    d、numpy.squeeze(arr, axis) 从给定数组的形状中删除一维的条目

import numpy as np# numpy.broadcast 用于模仿广播的对象,它返回一个对象,该对象封装了将一个数组广播到另一个数组的结果x = np.array([[1], [2], [3]])y = np.array([4, 5, 6])# 它拥有 iterator 属性,基于自身组件的迭代器元组# 发生广播,[(1, 4), (1, 5), (1, 6), (2, 4), (2, 5), (2, 6), (3, 4), (3, 5), (3, 6)]b = np.broadcast(x, y)c = np.empty(b.shape)       # 生成形状如 b 的随机数组print(c.shape)print('手动使用 broadcast 将 x 与 y 相加:')c.flat = [u + v for (u, v) in b]print("x+y: ", c)# 若把下面 b 的代码注释掉时输出空列表,以为迭代器指向末尾b = np.broadcast(x, y)lst = [o for o in b]print("lst: ", lst)# numpy.broadcast_to(array, shape, subok) 将数组广播到新形状。它在原始数组上返回只读视图,通常不连续a = np.array([[1], [2], [3]])b = np.broadcast_to(a, (3, 2))      # [[1 1] [2 2] [3 3]]print("b: ", b)# numpy.expand_dims(arr, axis) 通过在指定位置插入新的轴来扩展数组形状a = np.array([[1, 2], [3, 4]])print("shape of a: ", a.shape)      # (2, 2)# 可以将 axis 看成数组形状元组的下标,在对应下标插入新轴b = np.expand_dims(a, axis=0)print("b: ", b)     # [[[1 2] [3 4]]]print("shape of b: ", b.shape)      # (1, 2, 2)b = np.expand_dims(a, axis=1)print("b: ", b)     # [[[1 2]] [[3 4]]]print("shape of b: ", b.shape)      # (2, 1, 2)# numpy.squeeze(arr, axis) 从给定数组的形状中删除一维的条目x = np.arange(9).reshape(1, 3, 3)print("x: ", x)print("shape of x: ", x.shape)      # (1, 3, 3)# 注意是一维的条目,若在这里 axis=1 则会报错,以为 axis=1 轴不为 1y = np.squeeze(x, axis=0)print("y: ", y)print("shape of y: ", y.shape)      # (3, 3)

 

  4、连接数组

    anumpy.concatenate((a1, a2, ...), axis用于沿指定轴连接相同形状的两个或多个数组

    b、numpy.stack(arrays, axis=0, out=None用于沿新轴连接数组序列

    c、numpy.hstack((a1, a2, ...)) 是 numpy.stack 函数的变体,它通过水平堆叠来生成数组

    d、numpy.vstack((a1, a2, ...)) 是 numpy.stack 函数的变体,它通过垂直堆叠来生成数组

import numpy as np# numpy.concatenate((a1, a2, ...), axis) 用于沿指定轴连接相同形状的两个或多个数组a = np.array([[1, 2], [5, 6]])b = np.array([[3, 4], [7, 8]])# [[1 2 3 4] [5 6 7 8]]print("使用 1 轴连接 2 个数组: ", np.concatenate((a, b), axis=1))# numpy.stack(arrays, axis) 用于沿新轴连接数组序列,arrays相同形状的数组序列# [[1 2] [5 6] [3 4] [7 8]]print("使用 0 轴堆叠 2 个数组: ", np.concatenate((a, b), axis=0))# numpy.hstack((a1, a2, ...)) 是 numpy.stack 函数的变体,它通过水平堆叠来生成数组# [[1 2 3 4] [5 6 7 8]]print("水平堆叠: ", np.hstack((a, b)))# numpy.vstack((a1, a2, ...)) 是 numpy.stack 函数的变体,它通过垂直堆叠来生成数组# [[1 2] [5 6] [3 4] [7 8]]print("垂直堆叠: ", np.vstack((a, b)))

 

  5、分割数组

    a、numpy.split(ary, indices_or_sections, axis沿特定的轴将数组分割为子数组

    b、numpy.hsplit(ary, indices_or_sections) 用于水平分割数组,通过指定要返回的相同形状的数组数量来拆分原数组

    c、numpy.vsplit(ary, indices_or_sections) 用于垂直分割数组,其分割方式与hsplit用法相同

import numpy as np # numpy.split(ary, indices_or_sections, axis) 沿特定的轴将数组分割为子数组# indices_or_sections:果是一个整数,就用该数平均切分,如果是一个数组,为沿轴切分的位置(左开右闭)arr = np.linspace(1, 100, 10)print("每个子数组长度为 2 分割:", np.split(arr, 5))# 分割成 arr[0...2)    arr[2...4)  arr[4...7)  arr[7...-1]print("按特定下标分割:", np.split(arr, [2, 4, 7]))# numpy.hsplit(ary, indices_or_sections) 函数用于水平分割数组,通过指定要返回的相同形状的数组数量来拆分原数组arr = arr.reshape(2, 5)print("After reshape arr: ", arr)print("hsplit the arr: ", np.hsplit(arr, 5))# numpy.vsplit(ary, indices_or_sections) 沿着垂直轴分割,其分割方式与 hsplit 用法相同print("vsplit the arr: ", np.vsplit(arr, 2))

 

  6、数组元素的添加与删除

    a、numpy.resize(arr, shape) 返回指定大小的新数组;若新数组大小大于原始大小,则包含原始数组中的元素的副本

    b、numpy.append(arr, values, axis=None) 在数组的末尾添加值

    c、numpy.insert(arr, obj, values, axis=None在给定索引之前,沿给定轴在输入数组中插入值,obj 为索引

    d、numpy.delete(arr, obj, axis) 返回从输入数组中删除指定子数组的新数组,obj 为索引

    e、numpy.unique(arr, return_index, return_inverse, return_counts用于去除数组中的重复元素

 

import numpy as np# numpy.resize(arr, shape) 返回指定大小的新数组;若新数组大小大于原始大小,则包含原始数组中的元素的副本arr = np.sin(np.array([0, 30, 45, 60, 90, 120, 135, 150, 180]).reshape(3, 3) * np.pi/180)np.set_printoptions(precision=1)        # 保留小数点后一位print("resize(arr, (1, 9)): ", np.resize(arr, (1, 9)))# 大小大于原始大小,将数组的头 3 个的副本保存到最后一行print("resize(arr, (4, 3)): ", np.resize(arr, (4, 3)))# 保存数组第一个元素的副本到末尾print("resize(arr, (2, 5)): ", np.resize(arr, (2, 5)))np.set_printoptions(precision=8)        # 默认为 8# numpy.append(arr, values, axis=None) 在数组的末尾添加值arr = np.array([[1, 2, 3], [4, 5, 6]])# 当axis无定义时,是横向加成,返回总是为一维数组# [1 2 3 4 5 6 7 8 9]print("append(arr, [7, 8, 9]): ", np.append(arr, [7, 8, 9]))# 按 0 轴加成,列数要相同,还有就是追加的是二维数组# [[1 2 3] [4 5 6] [7 8 9]]print("append(arr, [7, 8, 9], axis=0): ", np.append(arr, [[7, 8, 9]], axis=0))# 注意行数要相同,[[1 2 3 4 5 6] [4 5 6 7 8 9]]print("append(arr, [[4, 5, 6], [7, 8, 9]], axis=1): ", np.append(arr, [[4, 5, 6], [7, 8, 9]], axis=1))# numpy.insert(arr, obj, values, axis) 在给定索引之前,沿给定轴在输入数组中插入值arr = np.array([1, 2, 3, 4, 5, 6]).reshape(3, 2)# 如果未提供轴,则输入数组会被展开print("insert(arr, 3, [6, 6, 6]): ", np.insert(arr, 3, [6, 6, 6]))print("insert(arr, 3, [7, 8], axis=0): ", np.insert(arr, 3, [7, 8], axis=0))# 若形状不匹配,还会试图广播数组print("insert(arr, 1, [6], axis=1): ", np.insert(arr, 1, [6], axis=1))# numpy.delete(arr, obj, axis) 返回从输入数组中删除指定子数组的新数组# 如果未提供轴,则输入数组会被展开print("delete(arr, 2): ", np.delete(arr, 2))# 分别按 0 轴和 1 轴删除下标为 1 的元素print("delete(arr, 1, axis=0): ", np.delete(arr, 1, axis=0))print("delete(arr, 1, axis=1): ", np.delete(arr, 1, axis=1))# numpy.unique(arr, return_index, return_inverse, return_counts) 用于去除数组中的重复元素arr = np.array([5, 3, 4, 2, 2, 1, 9, 0, 3, 4])print("unique(arr): ", np.unique(arr))# 若 return_index=True 则返回新元素在旧数组中(第一个符合的元素)的下标print("unique(arr, return_index=True): ", np.unique(arr, return_index=True))# 若 return_inverse=True 则返回旧数组元素在新数组中的下标print("unique(arr, return_inverse=True): ", np.unique(arr, return_inverse=True))# 若 return_counts=True 则返回对应元素在原数组中出现的次数print("unique(arr, return_counts=True): ", np.unique(arr, return_counts=True))

 

转载于:https://www.cnblogs.com/lemonyam/p/10756891.html

你可能感兴趣的文章
sql 语法大全
查看>>
SQLite移植手记1
查看>>
Java AmericanFlagSort
查看>>
Mysql远程连接报错
查看>>
C# windows程序应用与JavaScript 程序交互实现例子
查看>>
sqlServer去除字段中的中文
查看>>
HashMap详解
查看>>
Adobe Scout 入门
查看>>
51nod 1247可能的路径
查看>>
js05-DOM对象二
查看>>
mariadb BINLOG_FORMAT = STATEMENT 异常
查看>>
jq工具函数(九)使用$.extend()扩展Object对象
查看>>
如何监视性能和分析等待事件
查看>>
常见错误: 创建 WCF RIA Services 类库后, 访问数据库出错
查看>>
C3P0 WARN: Establishing SSL connection without server's identity verification is not recommended
查看>>
CSUOJ 1541 There is No Alternative
查看>>
iPhone在日本最牛,在中国输得最慘
查看>>
2014百度之星资格赛的第二个问题
查看>>
动态方法决议 和 消息转发
查看>>
关于UI资源获取资源的好的网站
查看>>