NumPy 创建数组
NumPy 数组创建的基本操作
ndarray 数组除了可以使用底层 ndarray 构造器来创建外,也可以通过以下几种方式来创建。
numpy.empty
numpy.empty 方法用来创建一个指定形状(shape)、数据类型(dtype)且未初始化的数组:
numpy.empty(shape, dtype = float, order = 'C')
返回给定形状和类型的新数组,而无需初始化条目。
参数
prototype - 空数组的形状。
dtype(可选) - 数组所需的输出数据类型,例如numpy.int8。默认值为 numpy.float64。
order(可选,默认:'C') - 有"C"和"F"两个选项,分别代表,行优先和列优先,在计算机内存中的存储元素的顺序。
返回值:给定数组形状,但数据类型和顺序未初始化(任意)数据的数组。
>>> import numpy as np
>>> np.empty([2, 2])
array([[1., 0.],
[0., 1.]])
>>> np.empty([2, 2], dtype=int)
array([[4607182418800017408, 0],
[ 0, 4607182418800017408]])
>>>
注意:注意 − 数组元素为随机值,因为它们未初始化。
numpy.empty_like
numpy.empty 返回形状和类型与给定数组相同的新数组。
numpy.empty_like(prototype, dtype=None, order='K', subok=True, shape=None)
返回形状和类型与给定数组相同的新数组
参数
prototype - 源数组的形状和数据类型定义了返回数组的这些相同属性。
dtype - 覆盖结果的数据类型。
order - 覆盖结果的内存布局。如果prototypeFortran连续,则“ A”表示“ F”,否则为“ C”。“ K”表示prototype 尽可能匹配布局。
subok - 如果为True,则新创建的数组将使用'a'的子类类型,否则它将是基类数组。默认为True。
shape - 覆盖结果的形状。如果order ='K'并且尺寸数量不变,将尝试保持顺序,否则,则暗示order ='C'。
返回值:形状和类型与原型相同的未初始化(任意)数据数组。
>>> import numpy as np
>>> a = ([1,2,3], [4,5,6]) # a is array-like
>>> np.empty_like(a)
array([[ 6917529027641081856, -6917520256071729910, 98],
[ 0, 0, 0]])
>>> a = np.array([[1., 2., 3.],[4.,5.,6.]])
>>> np.empty_like(a)
array([[ 2.68156159e+154, 2.68156159e+154, 3.32479618e+181],
[ 1.78476163e+185, -1.73059781e-077, 4.21535080e-309]])
numpy.zeros
创建指定大小的数组,数组元素以 0 来填充:
numpy.zeros(shape, dtype = float, order = 'C')
参数
shape - 空数组的形状。
dtype - 数组所需的输出数据类型,例如numpy.int8。默认值为 numpy.float64。
order - '{'C','F'},可选,默认:'C',表示以行(C)或列(Fortran)样式的顺序存储数据在内存中。
返回值:给定数组形状,数据类型和顺序的零数组。
>>> import numpy as np
>>> np.zeros(5)
array([0., 0., 0., 0., 0.])
>>> np.zeros((5,), dtype=int)
array([0, 0, 0, 0, 0])
>>> np.zeros((2, 1))
array([[0.],
[0.]])
>>> s = (2,2)
>>> np.zeros((2,), dtype=[('x', 'i4'), ('y', 'i4')]) # custom dtype
array([(0, 0), (0, 0)], dtype=[('x', ' ), ('y', '
numpy.zeros_like
zeros_like返回与给定数组具有相同形状和类型的零数组。
numpy.zeros_like(a, dtype=None, order='K', subok=True, shape=None)[source]
参数
a - 一个限定返回的数组形状和数据类型的属性。。
dtype - 数组所需的输出数据类型。
order - 覆盖结果的内存布局。
subok - 如果为True,则新创建的数组将使用'a'的子类类型,否则它将是基类数组。默认为True。
shapeint - 覆盖结果的形状。
返回值:一个具有相同形状和类型的零的阵列。
>>> import numpy as np
>>> x = np.arange(6)
>>> x = x.reshape((2, 3))
>>> print(x)
[[0 1 2]
[3 4 5]]
>>> np.zeros_like(x)
array([[0, 0, 0],
[0, 0, 0]])
>>> y = np.arange(3, dtype=float)
>>> y
array([0., 1., 2.])
>>> np.zeros_like(y)
array([0., 0., 0.])
numpy.ones
创建指定形状的数组,数组元素以 1 来填充:
numpy.ones(shape, dtype = None, order = 'C')
参数
shape - 数组形状。
dtype - 数据类型,可选
order - 'C' 用于 C 的行数组,或者 'F' 用于 FORTRAN 的列数组
>>> import numpy as np
>>> np.ones(5)
array([1., 1., 1., 1., 1.])
>>> np.ones((5,), dtype=int)
array([1, 1, 1, 1, 1])
>>> np.ones((2, 1))
array([[1.],
[1.]])
>>> s = (2,2)
>>> np.ones(s)
array([[1., 1.],
[1., 1.]])
numpy.ones_like
zeros_like返回形状与类型与给定数组相同的数组。
numpy.ones_like(a, dtype=None, order='K', subok=True, shape=None)
参数
a - 一个限定返回的数组形状和数据类型的属性。。
dtype - 数组所需的输出数据类型。
order - 覆盖结果的内存布局。
subok - 如果为True,则新创建的数组将使用'a'的子类类型,否则它将是基类数组。默认为True。
shape - 覆盖结果的形状。
返回值:一个具有相同形状和类型的零的阵列。
>>> import numpy as np
>>> x = np.arange(6)
>>> x = x.reshape((2, 3))
>>> x
array([[0, 1, 2],
[3, 4, 5]])
>>> np.ones_like(x)
array([[1, 1, 1],
[1, 1, 1]])
>>> y = np.arange(3, dtype=float)
>>> y
array([0., 1., 2.])
>>> np.ones_like(y)
array([1., 1., 1.])
numpy.arange
numpy.arange([ start,] stop,[ step,] dtype = None )
返回给定间隔内的均匀间隔的值。
在半开间隔 (即包括start但不包括stop的间隔)内生成值。对于整数参数,该函数等效于Python内置的 range函数,但返回ndarray而不是列表。[start, stop)
参数
start - 间隔的开始。间隔包括该值。默认起始值为0。
stop - 间隔结束。该间隔不包括该值,除非在某些情况下,step不是整数,并且浮点舍入会影响out的长度。
step - 值之间的间距。对于任何输出出来,这是两个相邻值之间的距离,默认步长为1。
dtype - 输出数组的类型。
返回值:均匀间隔的值的数组。
>>> import numpy as np
>>> np.arange(3)
array([0, 1, 2])
>>> np.arange(3.0)
array([0., 1., 2.])
>>> np.arange(3,7)
array([3, 4, 5, 6])
>>> np.arange(3,7,2)
array([3, 5])
numpy.linspace
numpy.linspace 函数用于创建一个一维数组,数组是一个等差数列构成的,格式如下:
np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
参数
start - 序列的起始值。
stop - 序列的终止值,如果endpoint为true,该值包含于数列中。
num - 要生成的等步长的样本数量,默认为50。
endpoint - 该值为 true 时,数列中包含stop值,反之不包含,默认是True。
retstep - 如果为 True 时,生成的数组中会显示间距,反之不显示。
dtype - ndarray 的数据类型。
以下实例用到三个参数,设置起始点为 1 ,终止点为 10,数列个数为 10。
>>> import numpy as np
>>> a = np.linspace(1,10,10)
>>> print(a)
[ 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.]
>>> a = np.linspace(10, 20, 5, endpoint = False)
>>> print(a)
[10. 12. 14. 16. 18.]
>>> a =np.linspace(1,10,10,retstep= True)
>>> print(a)
(array([ 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.]), 1.0)
>>> b =np.linspace(1,10,10).reshape([10,1])
>>> print(b)
[[ 1.]
[ 2.]
[ 3.]
[ 4.]
[ 5.]
[ 6.]
[ 7.]
[ 8.]
[ 9.]
[10.]]
numpy.asarray
直接对 Python 的基础数据类型(如列表、元组等)进行转换来生成 ndarray:
>>> import numpy as np
>>> ls1 = [10, 42, 0, -17, 30]
>>> nd1 =np.array(ls1)
>>> print(nd1)
[ 10 42 0 -17 30]
>>>
>>> print(type(nd1))
<class
'numpy.ndarray'>
>>> ls2 = [[8, -2, 0, 34, 7], [6, 7, 8, 9, 10]]
>>> nd2 =np.array(ls2)
>>> print(nd2)
[[ 8 -2 0 34 7]
[ 6 7 8 9 10]]
>>> print(type(nd2))
<class 'numpy.ndarray'>
numpy.asarray类似 numpy.array,但 numpy.asarray 参数只有三个,比 numpy.array 少两个。
numpy.asarray(a, dtype = None, order = None)
参数
a - 任意形式的输入参数,可以是,列表, 列表的元组, 元组, 元组的元组, 元组的列表,多维数组。
dtype - 数据类型,可选。
order - 要生成的等步长的样本数量,默认为50。
endpoint - 可选,有"C"和"F"两个选项,分别代表,行优先和列优先,在计算机内存中的存储元素的顺序。
>>> import numpy as np
>>> x = [1,2,3]
>>> a = np.asarray(x)
>>> a
array([1, 2, 3])
>>> x = (1,2,3)
>>> a = np.asarray(x)
>>> print (a)
[1 2 3]
>>> x = [(1,2,3),(4,5)]
>>> a = np.asarray(x)
>>> print(a)
[(1, 2, 3) (4, 5)]
>>> x = [1,2,3]
>>> a = np.asarray(x, dtype = float)
>>> print(a)
[1. 2. 3.]
numpy.frombuffer
numpy.frombuffer 用于实现动态数组。
numpy.frombuffer 接受 buffer 输入参数,以流的形式读入转化成 ndarray 对象。
numpy.frombuffer(buffer, dtype = float, count = -1, offset = 0)
注意:buffer 是字符串的时候,Python3 默认 str 是 Unicode 类型,所以要转成 bytestring 在原 str 前加上 b。
参数
buffer - 可以是任意对象,会以流的形式读入。
dtype - 返回数组的数据类型,可选
count - 读取的数据数量,默认为-1,读取所有数据。
offset - 读取的起始位置,默认为0。
>>> import numpy as np
>>> s = b'Hello Lidihuo'
>>> a = np.frombuffer(s, dtype = 'S1')
>>> print(a)
[b'H' b'e' b'l' b'l' b'o' b' ' b'L' b'i' b'd' b'i' b'h' b'u' b'o']
numpy.fromiter
numpy.fromiter 方法从可迭代对象中建立 ndarray 对象,返回一维数组。
numpy.fromiter(iterable, dtype, count=-1)
参数
iterable - 可迭代对象。
dtype - 返回数组的数据类型
count - 读取的数据数量,默认为-1,读取所有数据。
>>> import numpy as np
>>> # 使用 range 函数创建列表对象
>>> list=range(5)
>>> it=iter(list)
>>> x=np.fromiter(it, dtype=float)
>>> print(x)
[0. 1. 2. 3. 4.]
利用 random 模块生成数组
为了更有效地训练模型,提高模型的性能,有些初始化还需要满足一定的条件,如满足正态分布或均匀分布等。这里介绍了几种 np.random 模块中常用的方法,如下表所示。
函数 |
描述 |
np.random.random |
生成0到1之间的随机数 |
np.random.uniform |
生成均勻分布的随机数 |
np.random.randn |
生成标准正态的随机数 |
np.random.randint |
生成随机的整数 |
np.random.normal |
生成正态分布 |
np.random.shuffle |
随机打乱顺序 |
np.random.seed |
设置随机数种子 |
random_sample |
生成随机的浮点数 |
>>> import numpy as np
>>> # 生成全是 0 的 3x3 矩阵
>>> nd5 =np.zeros([3, 3])
>>> print("nd5 =\n", nd5)
nd5 =
[[0. 0. 0.]
[0. 0. 0.]
[0. 0. 0.]]
>>> # 生成全是 1 的 3x3 矩阵
>>> nd6 = np.ones([3, 3])
>>> print("nd6 =\n", nd6)
nd6 =
[[1. 1. 1.]
[1. 1. 1.]
[1. 1. 1.]]
>>>
>>> # 生成 4 阶的单位矩阵
>>> nd7 = np.eye(4)
>>> print("nd7 =\n", nd7)
nd7 =
[[1. 0. 0. 0.]
[0. 1. 0. 0.]
[0. 0. 1. 0.]
[0. 0. 0. 1.]]
>>> # 生成 4 阶对角矩阵
>>> nd8 = np.diag([1, 8, 3, 10])
>>> print("nd8 =\n", nd8)
nd8 =
[[ 1 0 0 0]
[ 0 8 0 0]
[ 0 0 3 0]
[ 0 0 0 10]]