1、Numpy认识
Numpy 是用于数据科学计算的基础,不但能够完成科学计算任务,还能被用作高效地多维数据容器。用于存储和处理大型矩阵。
Python 提供了一个 array 模块,和 list 不同,它直接保存数值,但是由于 Python 的 array模块不支持多维,也没有各种运算函数。
Numpy 弥补了这一遗憾。Numpy 提供了一种数组对象——ndarray(下文统称数组)
关于 ndarray 数组对象的认识:
是一种内存连续的、存储单一数据类型的、可以存储多维数组的对象。
存在两种存储方式:
C 风格存储(C 语言风格) ----行优先存储
F 风格存储(Fortran 语言风格)---列优先存储
图解
2、Numpy属性
ndim 与 shape 属性
import numpy as np
# 创建数组
# 可以使用np.array将list对象转化为数组
arr = np.array(5)
print('arr:\n', arr)
print('arr:\n', type(arr))
# arr = np.array([1, 2, 3, 4, 0])
# print('arr:\n', arr) # [1 2 3 4]
# print('arr:\n', type(arr)) # <class 'numpy.ndarray'>
# print('*' * 100)
#
# arr = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
# print('arr:\n', arr)
# print('arr:\n', type(arr))
# print('*' * 100)
#
# arr = np.array([[[1, 2, 3, 4], [5, 6, 7, 8]], [[1, 2, 3, 4], [5, 6, 7, 8]]])
# print('arr:\n', arr)
# print('arr:\n', type(arr))
# print('*' * 100)
# 查看ndarray属性
print('数组的维度:', arr.ndim)
print('数组的形状:', arr.shape) # 返回一个元组,
# ndim = len(shape)
# print('数组的元素个数为:', arr.size)
#
# print('数组的元素的数据类型为:', arr.dtype) # int32 --->32位平台的int类型
#
# print('数组元素的占位大小:', arr.itemsize) # 4 --->指定的占位的字节大小
ndarry 数据类型
import numpy as np
# numpy中的数据类型: numpy中的数据类型封装了python基础的数据类型,并进行了细致划分,变为numpy.数据类型
# numpy中数据类型的用法
# 1、可以在创建数组的时候,通过dtype参数来指定数组的数据元素类型
# arr = np.array([1, 2, 3, 4], dtype=np.float64)
# print('arr:\n',arr)
# print('arr:\n',arr.dtype)
# 如果一个ndarray里面全部都是bool类型的数据---->bool数组
# 0 转化为bool类型为False
# 非0 转化为bool类型为True
# arr = np.array([1, 2, 3, 0], dtype=np.bool)
# print('arr:\n', arr)
# print('arr:\n', arr.dtype)
# 2、也可以数据之间的强制转化
# print(np.int32(3.0))
# print(np.float64(5))
# print(np.float64('10'))
# # print(np.float64('a')) # 不能转化的
# print(np.bool(1))
# print(np.bool(0))
# 3、如果已经创建好数组,可以通过astype来修改已知数组的数据类型
# arr = np.array([1, 2, 3, 4])
# print('arr:\n', arr)
# print('arr:\n', type(arr))
# print('arr:\n', arr.dtype)
# print('*' * 100)
# 对arr数据类型进行修改
# arr = arr.astype(np.float64)
# print('arr:\n', arr)
# print('arr:\n', arr.dtype)
# 注意:不能使用属性重新赋值
# arr.dtype = np.float64 # 错误的
# print('arr:\n', arr)
# print('arr:\n', arr.dtype)
# # 强制转化
# arr = np.float64(arr)
# print('arr:\n', arr)
# print('arr:\n', arr.dtype)
# 4、了解:存储复合类型
# 需要自定义dtype来实现复合类型的存储
# dtype = np.dtype([('name', np.str, 60), ('hight', np.float64), ('weight', np.float64)])
#
# # 创建数组
# arr = np.array([('zs', 175.5, 65.0), ('ls', 170.0, 55.5), ('ww', 178.5, 63)], dtype=dtype)
# print('arr:\n', arr)
# print('arr:\n', arr.ndim)
#
# # 查看其他属性
# print('arr:\n', arr.shape)
# print('arr:\n', arr.itemsize) # 保证数据中每一个元素都能进行保存
# print('arr:\n', arr.dtype) # [('name', '<U60'), ('hight', '<f8'), ('weight', '<f8')]
# <U <f <i --->表示的字符串、float、int
# 不使用ndarray来存储复合类型。 ---ndarray主要用来存储数值型数据用来科学计算的。
# 形状 ---数组的shape
# 如果已经确定的数组---修改形状 ---元素个数不能改变
arr = np.array([1, 2, 3, 4, 5, 6])
print('arr:\n', arr)
print('arr:\n', arr.shape)
print('arr:\n', arr.itemsize)
print('*' * 100)
# # 修改形状
# # shape属性重新赋值
# arr.shape = (3, 2)
# print('arr:\n', arr)
# print('arr:\n', arr.shape)
# 也可以使用reshape来修改形状
arr = arr.reshape((3, 2))
print('arr:\n', arr)
print('arr:\n', arr.shape)
# 注意:shape属性重新赋值 相比于reshape 少了一个copy的过程