Numpy - nadrray创建
对于内容的引用说明:
数组的创建:http://www.zmonster.me/2016/02/25/creation-and-io-of-ndarray.html,感谢ZMonster's Blog原创内容。
1.ndarray数组的创建方法
- 从Python中的列表、元组、列表元祖混合等类型创建ndarray数组:
np.array(list,tuple)
- 从字节流(raw bytes)中创建ndarray数组。
- 从文件中读取特定格式中创建ndarray数组。
- 来自现有数组创建数组。
- 使用NumPy中函数创建ndarray数组:
【 注:在实际使用的时候多采用第一点、第四点和第五点来创建ndarray数组。实际上数组创建的方式还有很多,在此不一一列举】
2.常用函数方法总结
函数 | 说明 |
---|---|
np.arange(n,m,k) |
类似range() 函数,返回ndarray类型,元素从n到m-k,间隔k |
np.ones(shape) |
根据shape生成一个全1数组,shape是元组类型 |
np.zeros(shape) |
根据shape生成一个全0数组,shape是元组类型 |
np.full(shape,val) |
根据shape生成一个数组,shape是元组类型,每个元素的值都是val |
np.eye(n) |
创建一个正方的n*n单位矩阵,对角线为1,其余为0 |
np.ones_like(a) |
根据数组a的形状生成一个全1数组 |
np.zero_like(a) |
根据数组a的形状生成一个全0数组 |
np.full_like(a,val) |
根据数组a的形状生成一个全1数组 |
np.linspace(n,m,k) |
根据起止数据等间距地填充数据,形成数据,元素从n到m,间隔(m-n)/(k-1),元素个数为k |
np.linspace(n,m,k,endpoint=False) |
根据起止数据等间距地填充数据,形成数据,元素从n到m-(m-n)/k,间隔(m-n)/k,元素个数为k |
np.linspace(a,b,c,...) |
将两个或者多个数组合并成一个新的数组,原数组不变 |
arange、linspace与logspace
arange函数类似python中的range函数,通过指定初始值、终值以及步长(默认步长为1)来创建数组;
linspace函数通过指定初始值、终值以及元素个数来创建一维数组;
logspace函数与linspace类似,只不过它创建的是一个等比数列,同样的也是一个一维数组;
ones与zeros系列函数
某些时候,我们在创建数组之前已经确定了数组的维度以及各维度的长度。这时我们就可以使用numpy内建的一些函数来创建ndarray。例如:函数ones创建一个全1的数组、函数zeros创建一个全0的数组、函数empty创建一个内容随机的数组,在默认情况下,用这些函数创建的数组的类型都是float64,若需要指定数据类型,只需要闲置dtype参数即可。
fromstring与fromfunction
fromstring函数从字符串中读取数据并创建数组;
fromfunction函数由第一个参数作为计算每个数组元素的函数(函数对象或者lambda表达式均可),第二个参数为数组的形状。
3.创建数组
3.1从已有数据中创建
从 list, tuple 对象中创建:
import numpy as np
a= np.array([1, 2, 3, 4])
print('a is:', a)
b = np.array((1, 2, 3, 4))
print('b is:', b)
a is: [1 2 3 4]
b is: [1 2 3 4]
从文件中创建(关于文件操作使用pandas库):从文件中读取的方法有:fromfile,load, *loadtxt*。其中 fromfile 方法不建议使用,因为 fromfile 读取的文件要求是用 tofile 保存的,而 tofile 方法保存数据到文件时的具体行为是和具体平台有关的。
load 方法读取 save 方法保存下来的二进制文件:
from tempfile import TemporaryFile
origin_array = np.array([1, 2, 3, 4])
np.save('/tmp/array', origin_array)
array_from_file = np.load('/tmp/array.npy')
print array_from_file
再来看一下 /tmp/array.txt 里面的内容:
cat /tmp/array.txt
1.000000000000000000e+00
2.000000000000000000e+00
3.000000000000000000e+00
4.000000000000000000e+00
从字符串中读取:
用fromstring方法可以从字符串中读取数据并转换为一维数组:
array = np.fromstring('1 2 3 4', dtype=float, sep=' ')
print(array)
[ 1. 2. 3. 4.]
如果是用tostring将一个多维向量转换为字符串,然后再用 fromstring 读取,也只能得到一个一维数组。另外如果是读用 tostring 转换成的字符串,建议使用 fromstring 的时候显式指定数组中元素的数据类型,不然就有可能发生下面这样的悲剧:
array = np.array([1, 2, 3, 4], dtype=int)
print(np.fromstring(array.tostring()))
[ 4.94065646e-324 9.88131292e-324 1.48219694e-323 1.97626258e-323]
fromiter 从可迭代对象中生成一维数组:
只能返回一维数组
必须显式指定数组中元素的数据类型
输入可以是所有可迭代对象,包括 :list、tuple、string、unicode, generator,但需要注意的是,这里的 list 和 tuple 不能有嵌套。
# coding: utf-8
import numpy as np
def count_generator():
for i in range(4):
yield i
print('from list:', np.fromiter([1, 2, 3, 4], int))
print('from tuple:', np.fromiter((1, 2, 3, 4), int))
print('from string:', np.fromiter('1234', int))
print('from unicode:', np.fromiter(u'白日依山尽', 'U1'))
print('from generator:', np.fromiter(count_generator(), int))
#输出
from list: [1 2 3 4]
from tuple: [1 2 3 4]
from string: [1 2 3 4]
from unicode: ['白' '日' '依' '山' '尽']
from generator: [0 1 2 3]
3.2 创建特定形状的多维数组并进行填充
ones:创建给定形状的多维数组并将数组中所有元素填充为 1:
print(np.ones((3, 4)))
[[ 1. 1. 1. 1.]
[ 1. 1. 1. 1.]
[ 1. 1. 1. 1.]]
zeros:类似 ones ,但用 0 进行填充:
print(np.zeros((3, 4)))
[[ 0. 0. 0. 0.]
[ 0. 0. 0. 0.]
[ 0. 0. 0. 0.]]
empty:类似 ones, 但不进行初始化,得到的多维数组中的元素值是不确定的。
print(np.empty((3, 4)))
[[ 6.93164023e-310 1.66900197e-316 4.64956088e-317 4.00193173e-322]
[ 1.77481898e-316 6.93164023e-310 9.30845863e-039 2.42092166e-322]
[ 6.93164023e-310 6.93164023e-310 4.68423639e-320 0.00000000e+000]]
full:类似 ones, 但需要自己手动指定需为多维数组填充的值。
print(np.full((3, 4), 17))
[[ 17. 17. 17. 17.]
[ 17. 17. 17. 17.]
[ 17. 17. 17. 17.]]
3.3从 arange 创建多维数组
arange:创建一个一维的数组,用法同 Python 内建方法range:
`numpy.arange(start, stop, step, dtype)`
构造器接受下列参数:
| 序号 | 参数及描述 | | :--- | :--- | | 1. |
start
范围的起始值,默认为0
| | 2. |stop
范围的终止值(不包含) | | 3. |step
两个值的间隔,默认为1
| | 4. |dtype
返回ndarray
的数据类型,如果没有提供,则会使用输入数据的类型。 |下面的例子展示了如何使用该函数:
### 示例 1 {#示例-1}
import numpy as np
x = np.arange(5)
print(x)
[0 1 2 3 4]
### 示例 2 {#示例-2}
#设置了 dtype
x = np.arange(5, dtype = float)
print(x)
[0. 1. 2. 3. 4.]
linspace:给定一个区间,取其 N 等分点组成一个一维数组:
numpy.linspace(start, stop, num, endpoint, retstep, dtype)
此函数类似于
arange()
函数。 在此函数中,指定了范围之间的均匀间隔数量,而不是步长。 此函数的用法如下。构造器接受下列参数:
| 序号 | 参数及描述 | | :--- | :--- | | 1. |
start
序列的起始值 | | 2. |stop
序列的终止值,如果endpoint
为true
,该值包含于序列中 | | 3. |num
要生成的等间隔样例数量,默认为50
| | 4. |endpoint
序列中是否包含stop
值,默认为ture
| | 5. |retstep
如果为true
,返回样例,以及连续数字之间的步长 | | 6. |dtype
输出ndarray
的数据类型 |下面的例子展示了
linspace
函数的用法。
### 示例 1 {#示例-1}
import numpy as np
x = np.linspace(10,20,5)
print(x)
##输出如下:
# [10. 12.5 15. 17.5 20.]
### 示例 2 {#示例-2}
#将 endpoint 设为 false
import numpy as np
x = np.linspace(10,20, 5, endpoint = False)
print(x)
#输出如下:
#[10. 12. 14. 16. 18.]
### 示例 3 {#示例-3}
#输出 retstep 值
import numpy as np
x = np.linspace(1,2,5, retstep = True)
print(x)
#这里的 retstep 为 0.25
#输出如下:
# (array([ 1. , 1.25, 1.5 , 1.75, 2. ]), 0.25)
logspace:给定一个对数尺度(log scale)区间,取其 N 等分点对应的线性尺度(linear scale)上的数值:
numpy.logscale(start, stop, num, endpoint, base, dtype)
此函数返回一个
ndarray
对象,其中包含在对数刻度上均匀分布的数字。 刻度的开始和结束端点是某个底数的幂,通常为 10。logspace
函数的输出由以下参数决定:| 序号 | 参数及描述 | | :--- | :--- | | 1. |
start
起始值是base ** start
| | 2. |stop
终止值是base ** stop
| | 3. |num
范围内的数值数量,默认为50
| | 4. |endpoint
如果为true
,终止值包含在输出数组当中 | | 5. |base
对数空间的底数,默认为10
| | 6. |dtype
输出数组的数据类型,如果没有提供,则取决于其它参数 |下面的例子展示了
logspace
函数的用法。
### 示例 1 {#示例-1}
import numpy as np
#默认底数是 10
a = np.logspace(1.0, 2.0, num = 10)
print(a)
#输出如下:
#[ 10. 12.91549665 16.68100537 21.5443469 27.82559402
# 35.93813664 46.41588834 59.94842503 77.42636827 100. ]
### 示例 2 {#示例-2}
## 将对数空间的底数设置为 2
import numpy as np
a = np.logspace(1,10,num = 10, base = 2)
print(a)
#输出如下:
#[ 2. 4. 8. 16. 32. 64. 128. 256. 512. 1024.]
3.4 numpy.array创建数组
它从任何暴露数组接口的对象,或从返回数组的任何方法创建一个ndarray。
numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
上面的构造器接受以下参数:
| 序号 | 参数及描述 |
| :--- | :--- |
| 1. | `object`任何暴露数组接口方法的对象都会返回一个数组或任何(嵌套)序列。 |
| 2. | `dtype`数组的所需数据类型,可选。 |
| 3. | `copy`可选,默认为`true`,对象是否被复制。 |
| 4. | `orderC`(按行)、`F`(按列)或`A`(任意,默认)。 |
| 5. | `subok`默认情况下,返回的数组被强制为基类数组。 如果为`true`,则返回子类。 |
| 6. | `ndimin`指定返回数组的最小维数。 |
看看下面的例子来更好地理解。
#### 示例 1
import numpy as np
a = np.array([1,2,3])
print(a)
#输出如下:
#[1, 2, 3]
#### 示例 2
#多于一个维度
import numpy as np
a = np.array([[1, 2], [3, 4]])
print(a)
# 输出如下:
#[[1, 2]
# [3, 4]]
#### 示例 3
#最小维度
import numpy as np
a = np.array([1, 2, 3,4,5], ndmin = 2)
print(a)
#输出如下:
#[[1, 2, 3, 4, 5]]
##### 示例 4
#dtype 参数
import numpy as np
# 后续会详细讲解dtype各种属性的含义
a = np.array([1, 2, 3], dtype = complex)
print(a)
#输出如下:
#[ 1.+0.j, 2.+0.j, 3.+0.j]
3.5 列表转换函数asarray
此函数类似于numpy.array
,除了它有较少的参数。 这个例程对于将 Python 序列转换为ndarray
非常有用。
numpy.asarray(a, dtype = None, order = None)
构造器接受下列参数:
| 序号 | 参数及描述 |
| :--- | :--- |
| 1. | `a`任意形式的输入参数,比如列表、列表的元组、元组、元组的元组、元组的列表 |
| 2. | `dtype`通常,输入数据的类型会应用到返回的`ndarray` |
| 3. | `order'C'`为按行的 C 风格数组,`'F'`为按列的 Fortran 风格数组 |
下面的例子展示了如何使用`asarray`函数:
### 示例 1 {#示例-1}
import numpy as np
x = [1,2,3]
a = np.asarray(x)
print(a)
#输出如下:
#[1 2 3]
### 示例 2 {#示例-2}
#设置了 dtype
import numpy as np
x = [1,2,3]
a = np.asarray(x, dtype = float)
print(a)
#输出如下:
#[ 1. 2. 3.]
### 示例 3 {#示例-3}
#来自元组的 ndarray
import numpy as np
x = (1,2,3)
a = np.asarray(x)
print(a)
#输出如下:
#[1 2 3]
### 示例 4 {#示例-4}
x = [(1,2,3),(4,5)]
a = np.asarray(x)
print(a)
#输出如下:
#[(1, 2, 3) (4, 5)]
3.6使用 range 函数创建列表对象
### 示例 1 {#示例-1}
import numpy as np
list = range(5)
print(list)
#输出如下:range(0, 5),实质就是0,1,2,3,4
#[0, 1, 2, 3, 4]
3.7 使用迭代器创建 ndarray
### 示例 2 {#示例-2}
#从列表中获得迭代器
import numpy as np
list = range(5)
it = iter(list)
x = np.fromiter(it, dtype = float)
print(x)
#输出如下:
#[0. 1. 2. 3. 4.]
3.8 使用坐标向量创建 ndarray
meshgrid:根据给定的坐标向量创建坐标矩阵
import numpy as np
print(np.meshgrid(np.arange(0, 6)))
#输出 [array([0, 1, 2, 3, 4, 5])]
x, y = np.meshgrid(np.arange(-1, 2), np.arange(0, 2))
print('x is:', x)
print('\ny is:', y)
print('\npoints built by (x, y):')
print(np.rec.fromarrays([x, y]))
#输出:
x is: [[-1 0 1]
[-1 0 1]]
y is: [[0 0 0]
[1 1 1]]
points built by (x, y):
[[(-1, 0) ( 0, 0) ( 1, 0)]
[(-1, 1) ( 0, 1) ( 1, 1)]]
在上面的例子中,所得到的是 X 轴上 [-1, 0, 1] 和 Y轴上 [0, 1] 构成的一个 3x2 的网格,共有 6 个点。返回的两个值中的 x 是这 6 个点 在 X 轴上的投影, y 则是这 6 个点在 y 轴上的投影。
meshgrid 方法的参数数量不受限,可以得到任意 N 维空间中的坐标矩阵。
了解 meshgrid 方法的功能后,可以来做一些有趣的事情,后续使用会在matplotlib库中涉及到。
mgrid:mgrid 的功能与 meshgrid 类似,但有几点不同:
[ ] mgrid 不是函数,而是一个类的对象
[ ] mgrid 和 meshgrid 的使用方式不一样,meshgrid 需要传入一维数组作为对象,而 mgrid 则直接使用 '[]' 运算符
import numpy as np
np.meshgrid(np.arange(-1, 2), np.arange(-1, 2))
np.mgrid[-1:2, -1:2]
array([[[-1, -1, -1],
[ 0, 0, 0],
[ 1, 1, 1]],
[[-1, 0, 1],
[-1, 0, 1],
[-1, 0, 1]]])
- [ ] 返回值的前两个顺序相反
import numpy as np
x, y = np.meshgrid(np.arange(-1, 1), np.arange(-1, 1))
xx, yy = np.mgrid[-1:1, -1:1]
print ((x - yy).sum(), (y - xx).sum())
x, y, z = np.meshgrid(np.arange(-1, 1), np.arange(-1, 1), np.arange(-1, 1))
xx, yy, zz = np.mgrid[-1:1, -1:1, -1:1]
print ((x - yy).sum(), (y - xx).sum(), (z - zz).sum())
x, y, z, w = np.meshgrid(np.arange(-1, 1), np.arange(-1, 1), np.arange(-1, 1), np.arange(-1, 1))
xx, yy, zz, ww = np.mgrid[-1:1, -1:1, -1:1, -1:1]
print ((x - yy).sum(), (y - xx).sum(), (z - zz).sum(), (w - ww).sum())
0 0
0 0 0
0 0 0 0
ogrid:
ogrid 与 mgrid 类似,也是类的对象而非函数,但和 mgrid 的不同之处在于,它返回的结果是稀疏的,既在每一个维度上是一个一维数组。
import numpy as np
x, y = np.mgrid[-1:2, 3:6]
print('x from mgrid:')
print(x)
print('y from mgrid:')
print(y)
x, y = np.ogrid[-1:2, 3:6]
print('x from ogrid:')
print(x)
print('y from ogrid:')
print(y)
x from mgrid:
[[-1 -1 -1]
[ 0 0 0]
[ 1 1 1]]
y from mgrid:
[[3 4 5]
[3 4 5]
[3 4 5]]
x from ogrid:
[[-1]
[ 0]
[ 1]]
y from ogrid:
[[3 4 5]]
3.9 fromfunction函数创建数组
fromfunction 的行为稍微有点不一样,它有三个参数:
- function
- shape
- dtype(optional)
其中 function 的参数个数要和 shape 的长度一致,fromfunction 会对 shape 对应的多维数组中每个元素的坐标传给 function ,然后将返回值组合起来。
import numpy as np
def f(x, y):
return (x, y)
def g(x, y):
return x + y
x, y = np.fromfunction(f, (3, 3))
print('x generated by f is:\n', x)
print('y generated by f is:\n', y)
print('array generated by g is:\n', np.fromfunction(g, (3, 3)))
x generated by f is:
[[ 0. 0. 0.]
[ 1. 1. 1.]
[ 2. 2. 2.]]
y generated by f is:
[[ 0. 1. 2.]
[ 0. 1. 2.]
[ 0. 1. 2.]]
array generated by g is:
[[ 0. 1. 2.]
[ 1. 2. 3.]
[ 2. 3. 4.]]