import numpy
import numpy as np
'''
0, NumPy下载与安装
pip install numpy
'''
'''
1, NumPy ndarray对象
NumPy 定义了一个 n 维数组对象,简称 ndarray 对象,它是一个一系列相同类型元素组成的数组集合。
数组中的每个元素都占有大小相同的内存块,您可以使用索引或切片的方式获取数组中的每个元素。
ndarray 对象有一个 dtype 属性,该属性用来描述元素的数据类型 。
ndarray 对象采用了数组的索引机制,将数组中的每个元素映射到内存块上,并且按照一定的布局对内存块进行排列,
常用的布局方式有两种,即按行或者按列。
'''
'''
1) 创建ndarray对象
通过 NumPy 的内置函数 array() 可以创建 ndarray 对象,其语法格式如下:
numpy.array(object, dtype = None, copy = True, order = None,ndmin = 0)
下面表格对其参数做了说明:
参数说明
序号 参数 描述说明
1 object 表示一个数组序列。
2 dtype 可选参数,通过它可以更改数组的数据类型。
3 copy 可选参数,表示数组能否被复制,默认是 True。
4 order 以哪种内存布局创建数组,有 3 个可选值,分别是 C(行序列)/F(列序列)/A(默认)。
5 ndmin 用于指定数组的维度。
'''
print("----创建ndarray对象----")
# 使用列表构建一维数组
a1 = numpy.array([1, 2, 3, 4, 5, 6])
print(a1)
# [1 2 3 4 5 6]
print(type(a1))
# <class 'numpy.ndarray'> ndarray数组类型
# 创建多维数组
b1 = numpy.array([[1, 2, 3, 4], [5, 6, 7, 8]])
print(b1)
'''
[[1 2 3 4]
[5 6 7 8]]
'''
# 如果要改变数组元素的数据类型,可以使用通过设置 dtype
c1 = numpy.array([1, 3, 4, 7], dtype="float32")
print(c1)
# [1. 3. 4. 7.]
'''
2) ndim 查看数组维数
'''
print("----ndim 查看数组维数----")
arr1 = numpy.array([[1, 2, 3, 4], [9, 10, 11, 13]])
print(arr1.ndim)
# 也可以使用 ndmin 参数创建不同维度的数组
arr2 = numpy.array([1, 2, 3, 4], ndmin=2)
print(arr2)
'''
3) reshape数组变维
数组的形状指的是多维数组的行数和列数。Numpy 模块提供 reshape(i, j) 函数可以改变多维数组行数i和列数j,
从而达到数组变维的目的。因此数组变维即对数组形状的重塑。
2 × 3 --reshape函数数组变维-> 3 × 2
-- numpy 一般取别名 np
import numpy as np
'''
print("----reshape数组变维----")
e1 = np.array([[1, 3], [2, 4], [3, 6]]) # 3行2列
print("原数组", e1)
#变维 2行3列,并不是矩阵的转置方式变维,而是下面最近的数据往上移动变维.
e2 = e1.reshape(2, 3)
print("新数组", e2)
'''
原数组 [[1 3]
[2 4]
[3 6]]
新数组 [[1 3 2]
[4 3 6]]
'''
e3 = np.array([[1, 3, 4, 5], [2, 4, 6, 7], [3, 6, 9, 8]]) # 3行4列
print("原数组", e3)
#变维 4行3列,并不是矩阵的转置方式变维,而是上面最后的数据往下移动变维.
e4 = e3.reshape(4, 3)
print("新数组", e4)
'''
原数组 [[1 3 4 5]
[2 4 6 7]
[3 6 9 8]]
新数组 [[1 3 4]
[5 2 4]
[6 7 3]
[6 9 8]]
'''
'''
2, NumPy数据类型
NumPy 作为 Python 的扩展包,它提供了比 Python 更加丰富的数据类型,如下所示:
NumPy数据类型
序号 数据类型 语言描述
1 bool_ 布尔型数据类型(True 或者 False)
2 int_ 默认整数类型,类似于 C 语言中的 long,取值为 int32 或 int64
3 intc 和 C 语言的 int 类型一样,一般是 int32 或 int 64
4 intp 用于索引的整数类型(类似于 C 的 ssize_t,通常为 int32 或 int64)
5 int8 代表与1字节相同的8位整数。值的范围是-128到127。
6 int16 代表 2 字节(16位)的整数。范围是-32768至32767。
7 int32 代表 4 字节(32位)整数。范围是-2147483648至2147483647。
8 int64 表示 8 字节(64位)整数。范围是-9223372036854775808至9223372036854775807。
9 uint8 代表1字节(8位)无符号整数。
10 uint16 2 字节(16位)无符号整数。
11 uint32 4 字节(32位)的无符号整数。
12 uint64 8 字节(64位)的无符号整数。
13 float_ float64 类型的简写。
14 float16 半精度浮点数,包括:1 个符号位,5 个指数位,10个尾数位。
15 float32 单精度浮点数,包括:1 个符号位,8 个指数位,23个尾数位。
16 float64 双精度浮点数,包括:1 个符号位,11 个指数位,52个尾数位。
17 complex_ 复数类型,与 complex128 类型相同。
18 complex64 表示实部和虚部共享 32 位的复数。
19 complex128 表示实部和虚部共享 64 位的复数。
20 str_ 表示字符串类型
21 string_ 表示字节串类型
1) 数据类型对象
数据类型对象(Data Type Object)又称 dtype 对象,主要用来描述数组元素的数据类型、大小以及字节顺序。
同时,它也可以用来创建结构化数据。比如常见的 int32、float32、uint8 都是 dtype 对象的实例,其语法格式如下:
np.dtype(object)
'''
print("----数据类型对象----")
a1 = np.dtype(np.int32)
print(a1)
'''
2) 数据类型标识码
NumPy 中每种数据类型都有一个唯一标识的字符码,如下所示:
数据类型标识码
字符 对应类型
b 代表布尔型
i 带符号整型
u 无符号整型
f 浮点型
c 复数浮点型
m 时间间隔(timedelta)
M datatime(日期时间)
O Python对象
S,a 字节串(S)与字符串(a)
U Unicode
V 原始数据(void)
'''
print("----数据类型标识码----")
# 使用数据类型标识码,创建一组结构化数据:
# 定义字段名 nums,以及数组数据类型i1
import numpy as np
dt = np.dtype([('nums','i1')])
print(dt)
a1 = np.array([(55,),(75,),(85,)], dtype = dt)
print(a1)
print(a1.dtype)
print(a1['nums'])
'''
3) 定义结构化数据
通常情况下,结构化数据使用字段的形式来描述某个对象的特征。
以下示例描述一位学生的姓名、年龄、分数的特征,该结构化数据其包含以下字段:
str 字段:name
int 字段:age
float 字段:score
'''
print("----定义结构化数据----")
student_dtype = np.dtype([('name','S20'), ('age', 'i1'), ('score', 'f2')])
#输出结构化数据 student
print(student_dtype)
#将其应用于ndarray对象
stu_array = np.array([('zhangsan', 16, 79.50),('lisi', 18, 86.80)], dtype = student_dtype)
print(stu_array)
'''
[('name', 'S20'), ('age', 'i1'), ('score', '<f2')]
[(b'zhangsan', 16, 79.5) (b'lisi', 18, 86.8)]
'''
'''
3, NumPy数组属性
Numpy 数组的常用属性
1) ndarray.shape
shape 属性的返回值一个由数组维度构成的元组,比如 3 行 2 列的二维数组可以表示为(3,2),
该属性可以用来调整数组维度的大小。
'''
print("----NumPy数组常用属性----")
print("----ndarray.shape,属性的返回值一个由数组维度构成的元组----")
a1 = np.array([[1, 3], [2, 4], [3, 6]])
print("数组维度构成的元组:", a1.shape)
print("原数组:", a1)
# 通过 shape 属性修改数组的形状大小:功能类似 np.reshape(i,j)变维
a1.shape = (2,3)
print("新数组:", a1)
'''
数组维度构成的元组: (3, 2)
原数组: [[1 3]
[2 4]
[3 6]]
新数组: [[1 3 2]
[4 3 6]]
'''
'''
2) ndarray.ndim
该属性返回的是数组的维数
'''
print("----ndarray.ndim,该属性返回的是数组的维数----")
#随机生成一个一维数组
c1 = np.arange(18)
print("一维数组:",c1)
print("一维数组维数:",c1.ndim)
#对数组进行变维操作
e1 = c1.reshape(2,3,3)
print("变维数组后:",e1)
print("变维数组后维数:",e1.ndim)
'''
一维数组: [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17]
一维数组维数: 1
变维数组后: [[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]]
[[ 9 10 11]
[12 13 14]
[15 16 17]]]
变维数组后维数: 3
'''
'''
3) ndarray.itemsize
返回数组中每个元素的大小(以字节为单位)
'''
#数据类型为int8,代表1字节
x1 = np.array([1, 3, 5], dtype = np.int8)
print("ndarray.itemsize 每个元素的大小(以字节为单位):",x1.itemsize)
'''
4) ndarray.flags
返回 ndarray 数组的内存信息,比如 ndarray 数组的存储方式,以及是否是其他数组的副本等
'''
print("ndarray.flags 内存信息 :",x1.flags)
'''
ndarray.flags 内存信息 : C_CONTIGUOUS : True
F_CONTIGUOUS : True
OWNDATA : True
WRITEABLE : True
ALIGNED : True
WRITEBACKIFCOPY : False
UPDATEIFCOPY : False
'''