Numpy创建数组

引入:

上次我们了解了Numpy操作的对象是Ndarray数组,并学习了一些Numpy数组的基本属性。实际上,Numpy的基本思想就是面向数组编程,在数据处理中,我们往往需要对某一行或列进行处理,这时就需要用Numpy提取为Ndarray对象进行处理。现在让我们真正开始Numpy的学习,就像我们学习大多数语言那样,我们该如何创建出一个对象?这就是本节的重点,Numpy创建数组。


numpy.empty

numpy.empty 方法用来创建一个指定形状(shape)、数据类型(dtype)且未初始化的数组,我们有如下三个参数可供选择:

参数 描述
shape 数组形状
dtype 数据类型,可选
order 有"C"和"F"两个选项,分别代表,行优先和列优先,在计算机内存中的存储元素的顺序。

现在让我们创建一个数组!

import numpy as np 
x = np.empty([3,2], dtype = int) 
print (x)

得到:

[[         0 1072693248]
 [         0 1073741824]
 [         0 1074266112]]

numpy.zeros

numpy.zeros用来创建指定大小的数组,数组元素以 0 来填充。

我们来看以下三个例子,这三个例子更加有助于我们了解方法的参数列表.

# 默认为浮点数
x = np.zeros(5) 
print(x)
 
# 设置类型为整数
y = np.zeros((5,), dtype = np.int) 
print(y)
 
# 自定义类型
z = np.zeros((2,2), dtype = [('x', 'i4'), ('y', 'i4')])  
print(z)

这三个结果分别是:

[0. 0. 0. 0. 0.]
[0 0 0 0 0]
[[(0, 0) (0, 0)]
 [(0, 0) (0, 0)]]

另一个简洁的例子:

z = np.zeros((2,2))  
print(z)

得到:

[[0. 0.]
 [0. 0.]]

numpy.ones

numpy.ones同上述方法,它返回的均是1.

# 默认为浮点数
x = np.ones(5) 
print(x)
 
# 自定义类型
x = np.ones([2,2], dtype = int)
print(x)

返回:

[1. 1. 1. 1. 1.]
[[1 1]
 [1 1]]

Numpy 创建标准正态分布数组

在机器学习中,我们经常需要数据保持标准正态分布,Nmupy给我们提供了一个可以创建符合正态分布标准的数组。

from numpy import *

a=random.randint(100,200,(3,3))
print(a)

这个数组为:

[[122 108 183]
 [151 101 108]
 [145 102 133]]

总结:

通过上述几个方法,你现在一定已经学会了最基本创建数组的方法,接下来我们将学习如何从已有的数组创建新的数组。

NumPy 从已有的数组创建数组

numpy.asarray

numpy中的asarray方法可以将Python中的各种原始类型转换为numpy中的ndarray数组类型。

参数列表如下:

numpy.asarray(a, dtype = None, order = None)

参数 描述
a 任意形式的输入参数,可以是,列表, 列表的元组, 元组, 元组的元组, 元组的列表,多维数组
dtype 数据类型,可选
order 可选,有"C"和"F"两个选项,分别代表,行优先和列优先,在计算机内存中的存储元素的顺序。

让我们举一个最简单的例子:

import numpy as np 
 
x =  [1,2,3] 
a = np.asarray(x)  
print (a)

得到新的ndarray数组:

[1 2 3]

numpy.frombuffer

numpy.frombuffer 用于实现动态数组。

numpy.frombuffer(buffer, dtype = float, count = -1, offset = 0)

注意:buffer 是字符串的时候,Python3 默认 str 是 Unicode 类型,所以要转成 bytestring 在原 str 前加上 b。

参数 描述
buffer 可以是任意对象,会以流的形式读入。
dtype 返回数组的数据类型,可选
count 读取的数据数量,默认为-1,读取所有数据。
offset 读取的起始位置,默认为0。

可以用来读入字符串并将其转换为ndarray数组类型:

import numpy as np 
 
s =  b'Hello World' 
a = np.frombuffer(s, dtype =  'S1')  
print (a)
[b'H' b'e' b'l' b'l' b'o' b' ' b'W' b'o' b'r' b'l' b'd']

numpy.fromiter

numpy.fromiter 方法从可迭代对象中建立 ndarray 对象,返回一维数组。

# 使用 range 函数创建列表对象  
list=range(5)
it=iter(list)
 
# 使用迭代器创建 ndarray 
x=np.fromiter(it, dtype=float)
print(x)

返回结果:

[0. 1. 2. 3. 4.]

上述例子实际上是先构造一个循环到4为止的数组,迭代器就是 相当于i++的功能,随着i的不断循环,i不断自增。然后将这个数组转换为Ndarray对象。

NumPy 从数值范围创建数组

接下来的三个方法将是我们在数据处理中最常使用的三种方法。

numpy.arange

根据 start 与 stop 指定的范围以及 step 设定的步长,生成一个 ndarray。

参数 描述
start 起始值,默认为0
stop 终止值(不包含)
step 步长,默认为1
dtype 返回ndarray的数据类型,如果没有提供,则会使用输入数据的类型。

基本例子:

x = np.arange(5)  
print (x)

得到结果:

[0 1 2 3 4]

设置了dtype:

x = np.arange(5, dtype =  float)  
print (x)

结果为浮点数:

[0. 1. 2. 3. 4.]

设置了起始值、终止值及步长:

x = np.arange(10,20,2)  
print (x)

结果为从10开始,到20结束(不包括20),间隔为2的ndarray类型数组:

[10 12 14 16 18]

numpy.linspace

numpy.linspace 函数用于创建一个一维数组,数组是一个等差数列构成的,格式如下:

a = np.linspace(1,10,10)

设置元素全部是1的等差数列:

a = np.linspace(1,1,10)

将 endpoint 设为 false,不包含终止值:

a = np.linspace(10, 20,  5, endpoint =  False)  

如果将 endpoint 设为 true,则会包含 20。

以下实例设置间距。

a =np.linspace(1,10,10,retstep= True)
print(a)
# 拓展例子
b =np.linspace(1,10,10).reshape([10,1])
print(b)
(array([ 1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10.]), 1.0)
[[ 1.]
 [ 2.]
 [ 3.]
 [ 4.]
 [ 5.]
 [ 6.]
 [ 7.]
 [ 8.]
 [ 9.]
 [10.]]

numpy.logspace

numpy.logspace 函数用于创建一个于等比数列。格式如下:

# 默认底数是 10
a = np.logspace(1.0,  2.0, num =  10)  

设置底数为2

a = np.logspace(0,9,10,base=2)