NumPy 教程第 11 章:数组操作

Numpy 中包含了一些函数用于处理数组,大概可分为以下几类:

  • 修改数组形状

  • 翻转数组

  • 修改数组维度

  • 连接数组

  • 分割数组

  • 数组元素的添加与删除

修改数组形状

  • reshape 不改变数据的条件下修改形状

  • flat 数组元素迭代器

  • flatten 返回一份数组拷贝,对拷贝所做的修改不会影响原始数组

  • ravel 返回展开数组

numpy.reshape 函数

可以在不改变数据的条件下修改形状,格式如下:

numpy.reshape(arr,newshape,order='C')

参数说明:

  • arr:要修改形状的数组

  • newshape:整数或者整数数组,新的形状应当兼容原有形状

  • order:‘C’ – 按行,‘F’ – 按列,‘A’ – 原顺序,‘k’ – 元素在内存中的出现顺序

示例:

In [1]: import numpy as np

In [2]: sum = np.arange(8)

In [3]: sum
Out[3]: array([0,1,2,3,4,5,6,7])

In [4]: sum.reshape(4,2)
Out[4]:
array([[0,1],[2,3],[4,5],[6,7]])

numpy.ndarray.flat 函数

是一个数组元素迭代器

In [1]: import numpy as np

In [2]: sum = np.arange(9).reshape(3,3)

In [3]: for row in sum:
   ...:     print(row)
   ...:
[0 1 2]
[3 4 5]
[6 7 8]

In [4]: for element in sum.flat:
   ...:     print(element)
   ...:
0
1
2
3
4
5
6
7
8

numpy.ndarray.flatten 函数

返回一份数组拷贝,对拷贝所做的修改不会影响原始数组,格式如下:

ndarray.flatten(order='C')

参数说明:

  • order:‘C’ – 按行,‘F’ – 按列,‘A’ – 原顺序,‘K’ – 元素在内存中的出现顺序

示例:

In [1]: import numpy as np

In [2]: sum = np.arange(8).reshape(2,4)

In [3]: sum
Out[3]:
array([[0,7]])

In [4]: sum.flatten()
Out[4]: array([0,7])

In [5]: sum.flatten(order='F')
Out[5]: array([0,7])

numpy.ravel 函数

展平的数组元素,顺序通常是"C风格",返回的是数组视图(view,有点类似 C/C++引用reference的意味),修改会影响原始数组

numpy.ravel(num,order='C')

参数说明:

  • order:‘C’ – 按行,‘F’ – 按列,‘A’ – 原顺序,‘K’ – 元素在内存中的出现顺序

示例:

In [1]: import numpy as np

In [2]: num = np.arange(8).reshape(2,4)

In [3]: num
Out[3]:
array([[0,7]])

In [4]: num.ravel()
Out[4]: array([0,7])

In [5]: num.ravel(order='F')
Out[5]: array([0,7])

翻转数组

  • transpose 对换数组的维度

  • ndarray.T 和 self.transpose() 相同

  • rollaxis 向后滚动指定的轴

  • swapaxes 对换数组的两个轴

numpy.transpose 函数

用于对换数组的维度,格式如下:

numpy.transpose(arr,axes)
  • arr:要操作的数组

  • axes:整数列表,对应维度,通常所有维度都会对换

示例:

In [1]: import numpy as np

In [2]: num = np.arange(12).reshape(3,4)

In [3]: num
Out[3]:
array([[ 0,[ 4,7],[ 8,9,10,11]])

In [4]: np.transpose(num)
Out[4]:
array([[ 0,8],[ 1,9],[ 2,10],[ 3,7,11]])

numpy.ndarray.T 类似 numpy.transpose

In [5]: num.T
Out[5]:
array([[ 0,11]])

numpy.rollaxis 函数

向后滚动特定的轴到一个特定位置,格式如下:

numpy.rollaxis(arr,axis,start)

参数说明:

  • arr:数组

  • axis:要向后滚动的轴,其它轴的相对位置不会改变

  • start:默认为零,表示完整的滚动。会滚动到特定位置

示例:

In [1]: import numpy as np

In [2]: num = np.arange(8).reshape(2,2)

In [3]: num
Out[3]:
array([[[0,3]],[[4,7]]])

In [4]: np.rollaxis(num,2)
Out[4]:
array([[[0,2],6]],[[1,[5,7]]])

In [5]: np.rollaxis(num,1)
Out[5]:
array([[[0,[1,6],7]]])

numpy.swapaxes 函数

用于交换数组的两个轴,格式如下:

numpy.swapaxes(arr,axis1,axis2)

参数说明:

  • arr:输入的数组

  • axis1:对应第一个轴的整数

  • axis2:对应第二个轴的整数

示例:

In [1]: import numpy as np

In [2]: num = np.arange(8).reshape(2,7]]])

In [4]: np.swapaxes(num,0)
Out[4]:
array([[[0,4],[3,7]]])

修改数组维度

  • broadcast 产生模仿广播的对象

  • broadcast_to 将数组广播到新形状

  • expand_dims 扩展数组的形状

  • squeeze 从数组的形状中删除一维条目

numpy.broadcast 函数

用于模仿广播的对象,它返回一个对象,该对象封装了将一个数组广播到另一个数组的结果,该函数使用两个数组作为输入参数,如下实例:

In [1]: import numpy as np

In [2]: x = np.array([[1],[2],[3]])

In [3]: y = np.array([4,6])

In [4]: x
Out[4]:
array([[1],[3]])

In [5]: y
Out[5]: array([4,6])

In [6]: num = np.broadcast(x,y)

In [7]: num
Out[7]: <numpy.broadcast at 0x7fac788ebce0>

In [8]: a,b = num.iters

In [9]: a
Out[9]: <numpy.flatiter at 0x7fac779ede00>

In [10]: b
Out[10]: <numpy.flatiter at 0x7fac779c9e00>

In [11]: print(next(a),next(b))
1 4

In [12]: print(next(a),next(b))
1 5

In [13]: num.shape
Out[13]: (3,3)

In [14]: num = np.broadcast(x,y)

In [15]: ape = np.empty(num.shape)

In [16]: ape
Out[16]:
array([[0.,0.,0.],[0.,0.]])

In [17]: ape.shape
Out[17]: (3,3)

In [18]: ape.flat = [i + j for i,j in num]

In [19]: ape
Out[19]:
array([[5.,6.,7.],[6.,7.,8.],[7.,8.,9.]])

In [20]: x + y
Out[20]:
array([[5,[7,8,9]])

numpy.broadcast_to 函数

将数组广播到新形状,它在原始数组上返回只读视图,它通常不连续。 如果新形状不符合 NumPy 的广播规则,该函数可能会抛出 ValueError

numpy.broadcast_to(array,shape,subok)

示例:

In [1]: import numpy as np

In [2]: num = np.arange(4).reshape(1,4)

In [3]: num
Out[3]: array([[0,3]])

In [4]: np.broadcast_to(num,(4,4))
Out[4]:
array([[0,
[0,3]])

numpy.expand_dims 函数

通过在指定位置插入新的轴来扩展数组形状,函数格式如下:

numpy.expand_dims(arr,axis)

参数说明:

  • arr:输入数组

  • axis:新轴插入的位置

示例:

In [1]: import numpy as np

In [2]: x = np.array(([1,4]))

In [3]: x
Out[3]:
array([[1,4]])

In [4]: y = np.expand_dims(x,axis=0)

In [5]: y
Out[5]:
array([[[1,4]]])

In [6]: x.shape,y.shape
Out[6]: ((2,2),(1,2))

In [7]: y = np.expand_dims(x,axis=1)

In [8]: y
Out[8]:
array([[[1,2]],[[3,4]]])

In [9]: x.ndim,y.ndim
Out[9]: (2,3)

In [10]: x.shape,y.shape
Out[10]: ((2,(2,2))

numpy.squeeze 函数

从给定数组的形状中删除一维的条目,函数格式如下:

numpy.squeeze(arr,axis)

参数说明:

  • arr:输入数组

  • axis:整数或整数元组,用于选择形状中一维条目的子集

示例:

In [1]: import numpy as np

In [2]: x = np.arange(9).reshape(1,3)

In [3]: x
Out[3]:
array([[[0,8]]])

In [4]: y = np.squeeze(x)

In [5]: y
Out[5]:
array([[0,8]])

In [6]: x.shape,y.shape
Out[6]: ((1,3),(3,3))

连接数组

  • concatenate 连接沿现有轴的数组序列

  • stack 沿着新的轴加入一系列数组

  • hstack 水平堆叠序列中的数组(列方向)

  • vstack 竖直堆叠序列中的数组(行方向)

numpy.concatenate 函数

用于沿指定轴连接相同形状的两个或多个数组,格式如下:

numpy.concatenate((a1,a2,...),axis)

参数说明:

  • a1,…:相同类型的数组

  • axis:沿着它连接数组的轴,默认为 0

示例:

In [1]: import numpy as np

In [2]: x = np.array([[1,4]])

In [3]: x
Out[3]:
array([[1,4]])

In [4]: y = np.array([[5,8]])

In [5]: y
Out[5]:
array([[5,8]])

In [6]: np.concatenate((x,y))
Out[6]:
array([[1,8]])

In [7]: np.concatenate((x,y),axis=0)
Out[7]:
array([[1,8]])

In [8]: np.concatenate((x,axis=1)
Out[8]:
array([[1,8]])

numpy.stack 函数

用于沿新轴连接数组序列,格式如下:

numpy.stack(arrays,axis)

参数说明:

  • arrays相同形状的数组序列

  • axis:返回数组中的轴,输入数组沿着它来堆叠

示例:

In [1]: import numpy as np

In [2]: x = np.array([[1,8]])

In [6]: np.stack((x,0)
Out[6]:
array([[[1,4]],[[5,8]]])

In [7]: np.stack((x,1)
Out[7]:
array([[[1,8]]])

numpy.hstack 函数

numpy.hstack 函数是 numpy.stack 函数的变体,它通过水平堆叠来生成数组

In [1]: import numpy as np

In [2]: x = np.array([[1,8]])

In [6]: np.hstack((x,8]])

numpy.vstack 函数

numpy.vstack 函数是 numpy.stack 函数的变体,它通过垂直堆叠来生成数组

In [1]: import numpy as np

In [2]: x = np.array([[1,8]])

In [6]: np.vstack((x,8]])

分割数组

  • split 将一个数组分割为多个子数组

  • hsplit 将一个数组水平分割为多个子数组(按列)

  • vsplit 将一个数组垂直分割为多个子数组(按行)

numpy.split 函数

沿特定的轴将数组分割为子数组,格式如下:

numpy.split(ary,indices_or_sections,axis)

参数说明:

  • ary:被分割的数组

  • indices_or_sections:果是一个整数,就用该数平均切分,如果是一个数组,为沿轴切分的位置(左开右闭)

  • axis:沿着哪个维度进行切向,默认为0,横向切分。为1时,纵向切分

示例:

In [1]: import numpy as np

In [2]: num = np.arange(9)

In [3]: num
Out[3]: array([0,8])

In [4]: np.split(num,3)
Out[4]: [array([0,2]),array([3,5]),array([6,8])]

In [5]: np.split(num,7])
Out[5]: [array([0,3]),array([4,6]),array([7,8])]

numpy.hsplit 函数

用于水平分割数组,通过指定要返回的相同形状的数组数量来拆分原数组

In [1]: import numpy as np

In [2]: num = np.floor(10 * np.random.random((2,6)))

In [3]: num
Out[3]:
array([[8.,1.,2.],[3.,9.,5.,3.,5.]])

In [4]: np.hsplit(num,3)
Out[4]:
[array([[8.,9.]]),array([[6.,[5.,3.]]),array([[1.,[8.,5.]])]

numpy.vsplit 函数

沿着垂直轴分割,其分割方式与 hsplit 用法相同

In [1]: import numpy as np

In [2]: num = np.arange(16).reshape(4,11],[12,13,14,15]])

In [4]: np.vsplit(num,2)
Out[4]:
[array([[0,7]]),array([[ 8,15]])]

数组元素的添加与删除

  • resize 返回指定形状的新数组

  • append 将值添加到数组末尾

  • insert 沿指定轴将值插入到指定下标之前

  • delete 删掉某个轴的子数组,并返回删除后的新数组

  • unique 查找数组内的唯一元素

numpy.resize 函数

返回指定大小的新数组,如果新数组大小大于原始大小,则包含原始数组中的元素的副本

numpy.resize(arr,shape)

参数说明:

  • arr:要修改大小的数组

  • shape:返回数组的新形状

示例:

In [1]: import numpy as np

In [2]: x = np.array([[1,6]])

In [3]: x
Out[3]:
array([[1,6]])

In [4]: x.shape
Out[4]: (2,3)

In [5]: y = np.resize(x,2))

In [6]: y
Out[6]:
array([[1,6]])

In [7]: y.shape
Out[7]: (3,2)

In [8]: y = np.resize(x,3))

In [9]: y
Out[9]:
array([[1,3]])

numpy.append 函数

在数组的末尾添加值。 追加操作会分配整个数组,并把原来的数组复制到新数组中。 此外,输入数组的维度必须匹配否则将生成ValueError,append 函数返回的始终是一个一维数组

numpy.append(arr,values,axis=None)

参数说明:

arr:输入数组

  • values:要向arr添加的值,需要和arr形状相同(除了要添加的轴)

  • axis:默认为 None。当axis无定义时,是横向加成,返回总是为一维数组!当axis有定义的时候,分别为0和1的时候。当axis有定义的时候,分别为0和1的时候(列数要相同)。当axis为1时,数组是加在右边(行数要相同)

示例:

In [1]: import numpy as np

In [2]: num = np.array([[1,6]])

In [3]: num
Out[3]:
array([[1,6]])

In [4]: np.append(num,9])
Out[4]: array([1,9])

In [5]: np.append(num,[[7,9]],axis=0)
Out[5]:
array([[1,9]])

In [6]: np.append(num,axis=1)
Out[6]:
array([[1,9]])

numpy.insert 函数

在给定索引之前,沿给定轴在输入数组中插入值,如果值的类型转换为要插入,则它与输入数组不同。 插入没有原地的,函数会返回一个新数组。 此外,如果未提供轴,则输入数组会被展开

numpy.insert(arr,obj,axis)

参数说明:

  • arr:输入数组

  • obj:在其之前插入值的索引

  • values:要插入的值

  • axis:沿着它插入的轴,如果未提供,则输入数组会被展开

示例:

In [1]: import numpy as np

In [2]: num = np.array([[1,6]])

In [3]: num
Out[3]:
array([[1,
[3,
[5,6]])

In [4]: np.insert(num,[11,12])
Out[4]: array([ 1,11,12,6])

In [5]: np.insert(num,[11],axis=0)
Out[5]:
array([[ 1,
[11,
[ 3,
[ 5,6]])

In [6]: np.insert(num,axis=1)
Out[6]:
array([[ 1,6]])

numpy.delete 函数

返回从输入数组中删除指定子数组的新数组。 与 insert() 函数的情况一样,如果未提供轴参数,则输入数组将展开

Numpy.delete(arr,axis)

参数说明:

  • arr:输入数组

  • obj:可以被切片,整数或者整数数组,表明要从输入数组删除的子数组

  • axis:沿着它删除给定子数组的轴,如果未提供,则输入数组会被展开

示例:

In [1]: import numpy as np

In [2]: num = np.arange(12).reshape(3,11]])

In [4]: np.delete(num,5)
Out[4]: array([ 0,11])

In [5]: np.delete(num,axis=1)
Out[5]:
array([[ 0,11]])

In [6]: num = np.array([1,10])

In [7]: num
Out[7]: array([ 1,10])

In [8]: np.delete(num,np.s_[::2])
Out[8]: array([ 2,10])

numpy.unique 函数

用于去除数组中的重复元素

numpy.unique(arr,return_index,return_inverse,return_counts)
  • arr:输入数组,如果不是一维数组则会展开

  • return_index:如果为true,返回新列表元素在旧列表中的位置(下标),并以列表形式储

  • return_inverse:如果为true,返回旧列表元素在新列表中的位置(下标),并以列表形式储

  • return_counts:如果为true,返回去重数组中的元素在原数组中的出现次数

示例:

In [1]: import numpy as np

In [2]: num = np.array([5,9])

In [3]: num
Out[3]: array([5,9])

In [4]: np.unique(num)
Out[4]: array([2,9])

In [5]: np.unique(num,return_index=True)
Out[5]: (array([2,9]),array([1,9]))

In [6]: x,y = np.unique(num,return_index=True)

In [7]: y
Out[7]: array([1,9])

In [8]: np.unique(num,return_inverse=True)
Out[8]: (array([2,5]))

In [9]: x,return_inverse=True)

In [10]: x
Out[10]: array([2,9])

In [11]: y
Out[11]: array([1,5])

In [12]: x[y]
Out[12]: array([5,9])

In [13]: x,return_counts=True)

In [14]: x
Out[14]: array([2,9])

In [15]: y
Out[15]: array([3,1])

原文地址:https://blog.csdn.net/yilovexing

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


内存块风格 ndarray到底跟原生python列表有什么不同呢,请看一张图: 从图中我们可以看出ndarray在存储数据的时候,数据与数据的地址都是连续的,这样就给使得批量操作数组元素时速度更快。
6 替换array中的元素,并赋值给新的array 例如: 输入arr = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 输出out为array([ 0, -1,
1 如何查看np版本 import numpy as np print(np.__version__) 2 如何创建一维数据array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
11 找到两个array中的通用项,并保存在新的array中 例如:输入a = np.array([1,2,3,2,3,4,3,4,5,6]),b = np.array([7,2,10,2,7,4,9
待续。。。
NumPy - 简介NumPy 是一个 Python 包。 它代表 “Numeric Python”。 它是一个由多维数组对象和用于处理数组的例程集合组成的库。Numeric,即 NumPy 的前身,是由 Jim Hugunin 开发的。 也开发了另一个包 Numarray ,它拥有一些额外的功能。 2005年,Travis Oliphant 通过将 Numarray 的功能集成到 Numer...
NumPy 中定义的最重要的对象是称为 ndarray 的 N 维数组类型。 它描述相同类型的元素集合。 可以使用基于零的索引访问集合中的项目ndarray 中的每个元素在内存中使用相同大小的块。 ndarray 中的每个元素是数据类型对象的对象(称为 dtype)ndarray 原型:numpy.array(object, dtype=None, copy=True, order=None...
bool_存储为一个字节的布尔值(真或假)int_默认整数, 相当于 C 的long, 通常为int32或int64intc相当于 C 的int, 通常为int32或int64intp用于索引的整数, 相当于 C 的size_t, 通常为int32或int64int8字节(-128 ~ 127)int16 16 位整数(-32768 ~ 32767)int3...
调整数组的数组大小和维度ndarray.shape 返回一个包含数组维度的元组,也可以用于调整数组大小和维度In [1]: import numpy as npIn [2]: num = np.array([[1,2,3],[4,5,6]])In [3]: numOut[3]:array([[1, 2, 3], [4, 5, 6]])In [4]: num.sha...
numpy.empty 创建指定形状和dtype的未初始化数组numpy.empty(shape, dtype = float, order = 'C')Shape 空数组的形状,整数或整数元组Dtype 所需的输出数组类型,可选Order 'C’为按行的 C 风格数组,'F’为按列的 Fortran 风格数组下面的代码展示空数组的例子,因为它们未初始化,所以数组元素默...
numpy.asarray 此函数类似于numpy.array,它有较少的参数numpy.asarray(a, dtype = None, order = None)a 任意形式的输入参数,比如列表、列表的元组、元组、元组的元组、元组的列表dtype 通常,输入数据的类型会应用到返回的 ndarrayorder ‘C’ 为按行的 C 风格数组,‘F’ 为按列的 Fortran...
numpy.arange 方法创建数值范围并返回 ndarray 对象numpy.arange(start, stop, step, dtype)start 起始值,默认为 0stop 终止值(不包含)step 步长,默认为 1dtype 返回 ndarray 的数据类型,如果没有提供,则会使用输入数据的类型arange 方法语法:In [1]: import ...
ndarray 对象中的元素遵循基于零的索引。 有三种可用的索引方法类型: 字段访问,基本切片和高级索引ndarray 对象的内容可以通过索引或切片来访问和修改,与 Python 中 list 的切片操作一样ndarray 数组可以基于 0 - n 的下标进行索引,切片对象可以通过内置的 slice 函数,并设置 start, stop 及 step 参数进行,从原数组中切割出一个新数组In...
整数数组索引NumPy 比一般的 Python 序列提供更多的索引方式。除了之前看到的用整数和切片的索引外,数组可以由整数数组索引、布尔索引及花式索引实例获取数组中(0,0),(1,1)和(2,0)位置处的元素In [1]: import numpy as npIn [2]: num = np.array([[1, 2], [3, 4], [5, 6]])In [3]: n...
广播(Broadcast)是 numpy 对不同形状(shape)的数组进行数值计算的方式, 对数组的算术运算通常在相应的元素上进行如果两个数组 a 和 b 形状相同,即满足 a.shape == b.shape,那么 a*b 的结果就是 a 与 b 数组对应位相乘。这要求维数相同,且各维度的长度相同In [1]: import numpy as npIn [2]: a = np.arra...
NumPy 迭代器对象 numpy.nditer 提供了一种灵活访问一个或者多个数组元素的方式,迭代器最基本的任务的可以完成对数组元素的访问使用 arange() 函数创建一个 2X3 数组,并使用 nditer 对它进行迭代In [1]: import numpy as npIn [2]: num = np.arange(6).reshape(2,3)In [3]: numOut[...
Numpy 中包含了一些函数用于处理数组,大概可分为以下几类:修改数组形状翻转数组修改数组维度连接数组分割数组数组元素的添加与删除修改数组形状reshape 不改变数据的条件下修改形状flat 数组元素迭代器flatten 返回一份数组拷贝,对拷贝所做的修改不会影响原始数组ravel 返回展开数组numpy.reshape 函...
NumPy bitwise_ 开头的函数是位运算函数NumPy 位运算包括以下几个函数:bitwise_and 对数组元素执行位与操作bitwise_or 对数组元素执行位或操作invert 按位取反left_shift 向左移动二进制表示的位right_shift 向右移动二进制表示的位也可以用 Python 自身的位运算符进行操作:&amp;:按位与...
以下函数用于对 dtype 为 numpy.string_ 或 numpy.unicode_ 的数组执行向量化字符串操作它们基于 Python 内置库中的标准字符串函数,这些函数在字符数组类(numpy.char)中定义add() 对两个数组的逐个字符串元素进行连接multiply() 返回按元素多重连接后的字符串center() 居中字符串capitalize() 将字...
NumPy 包含大量的各种数学运算的函数,包括三角函数,算术运算的函数,复数处理函数等三角函数NumPy 提供了标准的三角函数:sin()、cos()、tan()In [1]: import numpy as npIn [2]: data = np.array([0,30,45,60,90])In [3]: np.sin(data * np.pi / 180)Out[3]: arr...