numpy简介
一、Ndarray对象
NumPy 中定义的最重要的对象是称为 ndarray
的 N 维数组类型。 它描述相同类型的元素集合。 可以使用基于零的索引访问集合中的项目。
ndarray
中的每个元素在内存中使用相同大小的块。 ndarray
中的每个元素是数据类型对象的对象(称为 dtype
)。
从ndarray
对象提取的任何元素(通过切片)由一个数组标量类型的 Python 对象表示。 下图显示了ndarray
,数据类型对象(dtype
)和数组标量类型之间的关系。
1、Ndarray
基本的ndarray
是使用 NumPy 中的数组函数创建的;
如:numpy.array
语法:
numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
示例1:
import numpy as np a = np.array([1,2,3]) print(a)
示例2:
# 多一个维度 import numpy as np a = np.array([[1, 2], [3, 4]]) print(a)
输出:
示例·3:
# dtype 参数 import numpy as np a = np.array([1, 2, 3], dtype = complex) print(a)
输出:
二、数据类型对象
语法:
numpy.dtype(object, align, copy)
参数:
-
Object
:被转换为数据类型的对象。 -
Align
:如果为true
,则向字段添加间隔,使其类似 C 的结构体。 -
Copy
: 生成dtype
对象的新副本,如果为flase
,结果是内建数据类型对象的引用。
三、数组属性
1、ndarray.shape
这一数组属性返回一个包含数组维度的元组,他也可以用于调整数组大小;
例1:
import numpy as np a = np.array([[1,2,3],[4,5,6]]) print a.shape
例2:
# 这会调整数组大小 import numpy as np a = np.array([[1,2,3],[4,5,6]]) a.shape = (3,2) print a
例3:
numpy也提供了reshape函数来调整数组大小
import numpy as np a = np.array([[1,2,3],[4,5,6]]) b = a.reshape(3,2) print b
2、ndarray.ndim
返回数组的维度
例1:
# 等间隔数字的数组 import numpy as np a = np.arange(24)
print a
例2:
# 一维数组 import numpy as np a = np.arange(24) a.ndim # 现在调整其大小 b = a.reshape(2,4,3) print b # b 现在拥有三个维度
3、numpy.itemsize
返回数组中每个元素的字节单位长度
例1:
# 数组的 dtype 为 int8(一个字节) import numpy as np x = np.array([1,2,3,4,5], dtype = np.int8) print x.itemsize
例2:
# 数组的 dtype 现在为 float32(四个字节) import numpy as np x = np.array([1,2,3,4,5], dtype = np.float32) print x.itemsize
4、numpy.empty
通过任何下列数组创建列程或使用低级ndarray构造函数构造
它创建指定形状和dtype
的未初始化数组。 它使用以下构造函数:
numpy.empty(shape, dtype = float, order = 'C')
参数:
例:
import numpy as np x = np.empty([3,2], dtype = int) print x
注:数组元素为随机值,因为他们未初始化
5、numpy.zeros
返回特定大小,以0填充的新数组。
参数:
例1:
# 含有 5 个 0 的数组,默认类型为 float import numpy as np x = np.zeros(5) print x
例:
# 自定义类型 import numpy as np x = np.zeros((2,2), dtype = [('x', 'i4'), ('y', 'i4')]) print x
6、numpy.ones
返回特定大小,以1填充的新数组
numpy.ones(shape, dtype = None, order = 'C')
参数:
四、来自现有数据的数组
1、asarray
语法:
numpy.asarray(a, dtype = None, order = None)
参数:
例1:
# 将列表转换为 ndarray import numpy as np x = [1,2,3] a = np.asarray(x) print a
五、来自数值范围的数组
1、arange
返回ndarray对象,包含给定范围内的等间隔值;
numpy.arange(start, stop, step, dtype)
参数:
例1:
import numpy as np x = np.arange(5) print x
例2:
# 设置了起始值和终止值参数 import numpy as np x = np.arange(10,20,2) print x
2、linspace
类似于arange()函数,在此函数中,指定了范围之间的均匀间隔数量,而不是步长
语法:
numpy.linspace(start, stop, num, endpoint, retstep, dtype)
参数:
例1:
import numpy as np x = np.linspace(10,20,5) print x
例2:
# 将 endpoint 设为 false import numpy as np x = np.linspace(10,20, 5, endpoint = False) print x
六、切片和索引
ndarray对象中的元素遵循基于零的索引。有三种可用的索引方法类型:字段访问,基本切片,高级索引;
1、切片
基本切片是 Python 中基本切片概念到 n 维的扩展。 通过将start
,stop
和step
参数提供给内置的slice
函数来构造一个 Python slice
对象。 此slice
对象被传递给数组来提取数组的一部分。
例1:
import numpy as np a = np.arange(10) s = slice(2,7,2) print a[s]
例2:
通过将由冒号分隔的切片参数(start:stop:step
)直接提供给ndarray
对象,也可以获得相同的结果。
import numpy as np a = np.arange(10) b = a[2:7:2] print b
例3:
# 最开始的数组 import numpy as np a = np.array([[1,2,3],[3,4,5],[4,5,6]]) print '我们的数组是:' print a print '\n' # 这会返回第二列元素的数组: print '第二列的元素是:' print a[...,1] print '\n' # 现在我们从第二行切片所有元素: print '第二行的元素是:' print a[1,...] print '\n' # 现在我们从第二列向后切片所有元素: print '第二列及其剩余元素是:' print a[...,1:]
2、索引
(1)整数索引
这种机制有助于基于 N 维索引来获取数组中任意元素。 每个整数数组表示该维度的下标值。 当索引的元素个数就是目标ndarray
的维度时,会变得相当直接。
以下示例获取了ndarray
对象中每一行指定列的一个元素。 因此,行索引包含所有行号,列索引指定要选择的元素。
例1:
import numpy as np x = np.array([[1, 2], [3, 4], [5, 6]]) y = x[[0,1,2], [0,1,0]] print y
例2:
获取4*3数组中的每个角处的元素。行索引是[0,0]和[3,3],而列索引是[0,2]和[0,2]:
import numpy as np x = np.array([[ 0, 1, 2],[ 3, 4, 5],[ 6, 7, 8],[ 9, 10, 11]]) print '我们的数组是:' print x print '\n' rows = np.array([[0,0],[3,3]]) cols = np.array([[0,2],[0,2]]) y = x[rows,cols] print '这个数组的每个角处的元素是:' print y
例3:
高级和基本索引可以通过使用切片:
或省略号...
与索引数组组合。 以下示例使用slice
作为列索引和高级索引。 当切片用于两者时,结果是相同的。 但高级索引会导致复制,并且可能有不同的内存布局。
import numpy as np x = np.array([[ 0, 1, 2],[ 3, 4, 5],[ 6, 7, 8],[ 9, 10, 11]]) print '我们的数组是:' print x print '\n' # 切片 z = x[1:4,1:3] print '切片之后,我们的数组变为:' print z print '\n' # 对列使用高级索引 y = x[1:4,[1,2]] print '对列使用高级索引来切片:' print y
(2)布尔索引
例1:
import numpy as np x = np.array([[ 0, 1, 2],[ 3, 4, 5],[ 6, 7, 8],[ 9, 10, 11]]) print '我们的数组是:' print x print '\n' # 现在我们会打印出大于 5 的元素 print '大于 5 的元素是:' print x[x > 5]
例2:
import numpy as np a = np.array([np.nan, 1,2,np.nan,3,4,5]) print a[~np.isnan(a)]
七、广播
指numpy在算术运算期间处理不同形状的数组的能力,对数组的算数运算通常在相应的元素上进行。如果两个阵列具有完全相同的形状,则这些操作被无缝执行。
例1:
import numpy as np a = np.array([1,2,3,4]) b = np.array([10,20,30,40]) c = a * b print(c)
如果两个数组的维数不相同,则元素到元素的操作是不可能的。 然而,在 NumPy 中仍然可以对形状不相似的数组进行操作,因为它拥有广播功能。 较小的数组会广播到较大数组的大小,以便使它们的形状可兼容。
如果满足以下规则,可以进行广播:
-
ndim
较小的数组会在前面追加一个长度为 1 的维度。 -
输出数组的每个维度的大小是输入数组该维度大小的最大值。
-
如果输入在每个维度中的大小与输出大小匹配,或其值正好为 1,则在计算中可它。
-
如果输入的某个维度大小为 1,则该维度中的第一个数据元素将用于该维度的所有计算。
如果上述规则产生有效结果,并且满足以下条件之一,那么数组被称为可广播的。
-
数组拥有相同形状。
-
数组拥有相同的维数,每个维度拥有相同长度,或者长度为 1。
-
数组拥有极少的维度,可以在其前面追加长度为 1 的维度,使上述条件成立。
import numpy as np a = np.array([[0.0,0.0,0.0],[10.0,10.0,10.0],[20.0,20.0,20.0],[30.0,30.0,30.0]]) b = np.array([1.0,2.0,3.0]) print '第一个数组:' print a print '\n' print '第二个数组:' print b print '\n' print '第一个数组加第二个数组:' print a + b
八、数组上的迭代
numpy包包含一个迭代器对象numpy.nditer。它是一个有效的多维迭代器对象,可以用于在数组上进行迭代。数组的每个元素可使用python的标准Iterator接口来访问。
例1:
a=np.arange(0,60,5) a=a.reshape(3,4) print('原始数组是:') print(a) print('修改后的数组是:') for x in np.nditer(a): print(x)
例2:
迭代的顺序匹配数组的内容布局,而不考虑特定的排序,这可以通过迭代上述数组的转置来看到。
import numpy as np a = np.arange(0,60,5) a = a.reshape(3,4) print '原始数组是:' print a print '\n' print '原始数组的转置是:' b = a.T print b print '\n' print '修改后的数组是:' for x in np.nditer(b): print x,
标签:python,np,数组,print,import,array,numpy From: https://www.cnblogs.com/xiao-wang-tong-xue/p/17219315.html