____tz_zs
NumPy (Numeric Python) 是用Python实现的科学计算库,提供了许多高级的数值编程工具,如:矩阵数据类型、矢量处理,以及精密的运算库。专为进行严格的数字处理而产生。
包括:
1、一个强大的N维数组对象Array;
2、比较成熟的(广播)函数库;
3、用于整合C/C++和Fortran代码的工具包;
4、实用的线性代数、傅里叶变换和随机数生成函数。
NumPy 的操作对象是多维数组 ndarray,NumPy 的基本运算是以数组为对象进行基本运算,即向量化操作
Python 本身没有数组这个说法,有的就是 list 和 tuple, list 就具有其他语言中的数组特性。不过 python 有提供一个 array 模块,用于提供基本数字,字符类型的数组。用于容纳字符号、整型、浮点等基本类型。 这种模块主要用于二进制上的缓冲区,流的操作。
创建 ndarray 对象
np.array 构造数组
# -*- coding: utf-8 -*-
"""
@author: tz_zs
"""
import numpy as np
# 构造整型数组
array_1 = np.array([1, 2, 3, 4, 5])
print(array_1)
print(array_1.dtype)
print(type(array_1))
'''
[1 2 3 4 5]
int32
<class 'numpy.ndarray'>
'''
# 构造浮点型数组
array_2 = np.array([1.1, 3., 3.14, 7.7])
print(array_2)
print(array_2.dtype)
print(type(array_2))
'''
[ 1.1 3. 3.14 7.7 ]
float64
<class 'numpy.ndarray'>
'''
# 构造32位浮点型数组
array_3 = np.array([1, 3, 5], dtype='float32')
print(array_3)
print(array_3.dtype)
print(type(array_3))
'''
[ 1. 3. 5.]
float32
<class 'numpy.ndarray'>
'''
# 构造一个嵌套列表结果的多维数组
array_4 = np.array([[i, i * i] for i in [5, 6, 7]])
print(array_4)
print(array_4.dtype)
print(type(array_4))
'''
[[ 5 25]
[ 6 36]
[ 7 49]]
int32
<class 'numpy.ndarray'>
'''
array_5 = np.array([[1, 2, 3, ], [4, 2, 3], [6, 2, 1]])
print(array_5)
print(array_5.dtype)
print(type(array_5))
'''
[[1 2 3]
[4 2 3]
[6 2 1]]
int32
<class 'numpy.ndarray'>
'''
np.arange() 创建数组
# -*- coding: utf-8 -*-
"""
@author: tz_zs
np.arange() 返回一个array对象
"""
import numpy as np
x = np.arange(9.).reshape(3, 3)
print(x)
'''
[[ 0. 1. 2.]
[ 3. 4. 5.]
[ 6. 7. 8.]]
'''
n1 = np.arange(6)
print(n1) # [0 1 2 3 4 5]
# 构造一个 2 到 10 之间,步长为 2 的数组(左开右闭)
# n2 = np.arange(2, 10, 2)
n2 = np.arange(start=2, stop=10, step=2)
print(n2) # [2 4 6 8]
另外:
- 快速构建 ndarray 对象(np.empty、np.full、np.titl、np.r_、np.linspace)
属性
数组的维度:ndarray.ndim 或 np.ndim(ndarray)
数组的形状:ndarray.shape
数组的类型:ndarray.dtype
#!/usr/bin/python2.7
# -*- coding:utf-8 -*-
"""
@author: tz_zs
"""
import numpy as np
n = np.zeros((2, 3))
print(n)
print(n.shape)
print(np.ndim(n))
print(n.ndim)
print(n.dtype)
"""
[[ 0. 0. 0.]
[ 0. 0. 0.]]
(2, 3)
2
2
float64
"""
n2 = np.zeros((2, 3, 4), dtype=int)
print(n2)
print(n2.shape)
print(np.ndim(n2))
print(n2.ndim)
print(n2.dtype)
"""
[[ 0. 0. 0. 0.]
[ 0. 0. 0. 0.]
[ 0. 0. 0. 0.]]]
(2, 3, 4)
3
3
int64
"""
查询数组中的具体数据
获取某些行某些列
# -*- coding: utf-8 -*-
"""
@author: tz_zs
取数组中的值
"""
import numpy as np
array_1 = np.array([5, 10, 15])
print(array_1[1])
print(array_1[0:2])
'''
10
[ 5 10]
'''
array_2 = np.array([[5, 10, 15], [20, 25, 30], [35, 40, 45]])
print(array_2[1, 2]) # 30
print(array_2[:, 1]) # [10 25 40]
print(array_2[:, 0:2])
'''
[[ 5 10]
[20 25]
[35 40]]
'''
print(array_2[1:3, 0:2])
'''
[[20 25]
[35 40]]
'''
切片截取
#!/usr/bin/python2.7
# -*- coding:utf-8 -*-
"""
@author: tz_zs
"""
import numpy as np
a = np.zeros((7, 7), dtype=int)
a[:2, :3] = 1
a[2:4, 2:4] = 2
a[4, 4] = 3
a[:, 5] = 4
a[[0, 2, 4, 6], 6] = 5
print(a)
"""
[[1 1 1 0 0 4 5]
[1 1 1 0 0 4 0]
[0 0 2 2 0 4 5]
[0 0 2 2 0 4 0]
[0 0 0 0 3 4 5]
[0 0 0 0 0 4 0]
[0 0 0 0 0 4 5]]
"""
条件筛选
#!/usr/bin/python2.7
# -*- coding:utf-8 -*-
"""
@author: tz_zs
"""
import numpy as np
n = np.array([[1, 2, 3, 4, 5], [2, 3, 4, 5, 6], [1, 3, 5, 7, 9]])
print(n)
"""
[[1 2 3 4 5]
[2 3 4 5 6]
[1 3 5 7 9]]
"""
# 比较所有的值,选择满足要求的值
r1 = n.copy()
print(r1 > 2)
"""
[[False False True True True]
[False True True True True]
[False True True True True]]
"""
r1[r1 > 2] = 11
print(r1)
"""
[[ 1 2 11 11 11]
[ 2 11 11 11 11]
[ 1 11 11 11 11]]
"""
# 比较某一列中的值,选择满足要求的那一行
r2 = n.copy()
b = r2[:, 4] > 6
print(b)
"""
[False False True]
"""
r2[b] = 11
print(r2)
"""
[[ 1 2 3 4 5]
[ 2 3 4 5 6]
[11 11 11 11 11]]
"""
# 比较某一行中的值,选择满足要求的那一列
r3 = n.copy()
b = r3[1, :] > 4
print(b)
"""
[False False False True True]
"""
r3[:, b] = 11
print(r3)
"""
[[ 1 2 3 11 11]
[ 2 3 4 11 11]
[ 1 3 5 11 11]]
"""
复制数组 copy
ndarray.copy()
判断 ndarray 中的值是否等于/大于/小于某个值
- 对 ndarray 进行的操作,会对其中的每个元素进行操作
复制 ndarray 对象
- n2 = n1只会复制地址值,指向同一个对象
- n2 = n1.view() 浅复制 虽然是不同的对象,不同的id,但他们共用了一套值
- ndarray.copy() 复制 ndarray 对象
# -*- coding: utf-8 -*-
"""
@author: tz_zs
判断 ndarray 中的值是否等于/大于/小于
对 ndarray 进行的操作,会对其中的每个元素进行操作
复制 ndarray 对象
n2 = n1只会复制地址值,指向同一个对象
n2 = n1.view() 浅复制 虽然是不同的对象,不同的id,但他们共用了一套值
ndarray.copy() 复制 ndarray 对象
"""
import numpy as np
n1 = np.array([5, 10, 15, 20])
print(n1 == 10)
# [False True False False]
n2 = np.array([[5, 10, 15], [20, 25, 30], [35, 40, 45]])
print(n2 >= 25)
'''
[[False False False]
[False True True]
[ True True True]]
'''
print((n2 == 10) | (n2 == 25))
'''
[[False True False]
[False True False]
[False False False]]
'''
# 可以使用 bool 值当索引
n_bool = (n2 == 10) | (n2 == 25) | (n2 == 45)
print(n_bool)
'''
[[False True False]
[False True False]
[False False True]]
'''
print(n2[n_bool])
# [10 25 45]
n3 = n2.copy() # 复制一个 ndarray 对象,n3 和 n2 的地址 id 不一样
n3[n_bool] = 100
print(n2)
'''
[[ 5 10 15]
[20 25 30]
[35 40 45]]
'''
print(n3)
'''
[[ 5 100 15]
[ 20 100 30]
[ 35 40 100]]
'''
·
修改数组维度
- ndarray.shape=(值) 直接赋值修改 shape
- ndarray.reshape() 有返回值,不会修改原对象,而是返回一个新的
- ndarray.resize() 无返回值,在原对象上进行修改
- ndarray..ravel() 拉平,变为一维数组。
- ndarray.T() 转置
# -*- coding: utf-8 -*-
"""
@author: tz_zs
更改维度
直接修改 shape
ndarray.reshape() 有返回值,不会修改原对象,而是返回一个新的
ndarray.resize() 无返回值,在原对象上进行修改
ndarray..ravel() 拉平,变为一维数组。
ps:(8, ) ≠ (8, 1):前者表示一维数组(无行和列的概念),后者则表示一个特殊的二维数组,也即是一个列向量;
"""
import numpy as np
# 构造数组
n1 = np.array([1, 2, 3, 4, 5, 6, 7, 8])
print(n1) # [1 2 3 4 5 6 7 8]
# 查看数组的维度
print(n1.shape) # (8,)
# 维度大小
print(n1.ndim) # 1
# 类型
print(n1.dtype) # int32
####### reshape #######
# 更改数组的维度为 (2, 4)
print('n2', '-' * 10)
n2 = n1.reshape(2, 4)
# n2 = n1.reshape(2, -1) # -1 代表让系统自己计算,因为确定前一个维度,第二个维度的值本身就已经确定了
print(n2)
print(n2.shape)
print(n2.ndim)
print(n2.dtype)
"""
[[1 2 3 4]
[5 6 7 8]]
(2, 4)
2
int32
"""
####### 直接修改 shape #######
n2.shape = (8)
print(n2)
print(n2.shape)
print(n2.ndim)
print(n2.dtype)
'''
[1 2 3 4 5 6 7 8]
(8,)
1
int32
'''
# 更改数组的维度为 (2, 2, 2)
print('n3', '-' * 10)
# n3 = n1.reshape(2, 2, 2)
n3 = n1.reshape(2, 2, -1) # -1 代表让系统自己计算,因为确定前两个维度,第三个维度的值本身就已经确定了
print(n3)
print(n3.shape)
print(n3.ndim)
print(n3.dtype)
'''
[[[1 2]
[3 4]]
[[5 6]
[7 8]]]
(2, 2, 2)
3
int32
'''
####### ravel #######
# 拉平,变为一维
print('n4', '-' * 10)
n4 = n3.ravel()
print(n4)
print(n4.shape)
'''
[1 2 3 4 5 6 7 8]
(8,)
'''
####### resize #######
# ndarray.resize() 无返回值,在原对象上进行修改
n5 = n3.resize(2, 4)
print(n3)
print(n5)
'''
[[1 2 3 4]
[5 6 7 8]]
None
'''
修改数据类型 astype
ndarray.astype()
# -*- coding: utf-8 -*-
"""
@author: tz_zs
ndarray.astype()方法来转换数组的数据类型
"""
import numpy as np
n = np.array(['1', '2', '3', '4'])
print(n.dtype) # <U1
print(n) # ['1' '2' '3' '4']
n2 = n.astype(float)
print(n2.dtype) # float64
print(n2) # [ 1. 2. 3. 4.]
end