Numpy的基石——ndarray数组
1. Numpy中的数组——ndarray
在 Numpy 中重要的内核就是 ndarray 多维数组,进行数据分析时,对数据进行运算很大程度上依赖于 ndarray。
ndarray不单单是由数据构成的,它是一个数组对象:
ndarray 对象分为两个部分:一个部分是 header、一个是 data。
header 部分可以理解为数组属性块,里面有着 ndarray 数组对象所需要的一些属性,比如该数组的步长、数组的形状、数组中数据的类型,等等。
data 部分就可以理解为 C 语言中的数组了,存储的是数据。
ndarray 的常见属性有形状
、数组维度
、元素个数
、数据类型
等等,通过这些属性,能够帮助我们更好地了解 ndarray。下面我们就来介绍一下 ndarray 的相关属性吧!
1.1 shape(形状)
shape 为 Ndarray 的形状。举个例子,一个二行三列的数组,它的的形状便可以由(2,3)这个元组表示。
它是几行几列的数组,那么它的形状就能够通过元组表示出来:(行数, 列数)
1.2 ndim(维度)
ndim 是 ndarray 数组对象的维度属性,维度我们可以理解为这个数组轴的数量或者理解为代表数组形状的元组的大小。比如一个三行四列的数组,它的 shape 属性为(3,4),该元组的大小为 2,我们就可以说该数组的维度 ndim 为 2。
1.3 size(大小)
size 为 ndarray 数组的大小,也就是数组中的元素个数。通常 ndarray 数组的大小为各个维度上数组大小的乘积,换句话说就是代表形状的元组的各个元素的乘积,比如一个三维数组,它的形状为(3,4,2),据此我们就可以知道它的大小为 24。
1.4 dtype(数据类型)
dtype 是 ndarray 的数据类型,通过该属性我们能够知道 ndarray 中存储数据的数据类型。
Numpy的数据类型主要分为以下几种:
- 整数类型:包括
int8
int16
int32
int64
,注意都是带符号的整数 - 浮点类型:包括
float16
、float32
、float64
- 复数类型:包括
complex64
、complex128
- 布尔类型:即
bool
,只有True和False两个取值 - 字符串类型:即
str
import numpy as np
arr = np.array([
[1, 2, 3],
[4, 5, 6],
])
# ------------------ 属性 ------------------
# shape属性:数组的形状
print(f"数组的形状:{arr.shape}") # 数组的形状:(2, 3)
# ndim 维度属性
print(f"数组的维度:{arr.ndim}") # 数组的维度:2
# size属性:数组的大小
print(f"数组的大小:{arr.size}") # 数组的大小:6
# dtype数据类型
print(f"数组的数据类型:{arr.dtype}") # 数组的数据类型:int32
2. 使用astype强转数据类型
改变数据类型使用的是 astype
方法。astype 方法是强制转换数据类型,但是转换之后是不改变原数组元素类型的,而是生成一个新的数组。
import numpy as np
arr = np.array([
[1, 2, 3],
[4, 5, 6],
])
# astype 强制转换数据类型
print(f"原始数据类型:{arr.dtype}") # 原始数据类型:int32
new_arr = arr.astype("float")
print(f"强制转换之后的数据类型:{new_arr.dtype}") # 强制转换之后的数据类型:float64
3. 自定义结构化数据
我们知道,数组只能够存储同一类型的数据,但是在实际的需求中,我们接触到的大部分都是一条数据中包含多个属性数据,例如一张成绩表中,每条数据都包含姓名、学号、成绩等数据,分别对应字符串、整型、浮点型等数据类型,而在数据类型中,我们不能从已有的数据类型中找到一个合适的数据类型来对应我们成绩表中的数据,这时候我们就需要利用到数据类型对象来新建一个结构化数据类型。
NumPy 中定义结构化数据需要用到 dtype 对象。
在创建结构化数据时,我们需要用到对应数据类型的标识码,不同的数据类型字符码是不一样的,如下所示:
字符码 | 数据类型 |
---|---|
b | 布尔类型 |
i | 带符号整型 |
u | 无符号整型 |
f | 浮点数整型 |
c | 复数类型 |
m | 日期类型 |
O | 对象类型 |
S 或 a | 字符串类型 |
U | Unicode类型 |
V | void类型 |
下面我们来看看如何利用 dtype 来定义结构化数据并且应用。
import numpy as np
# dtype 自定义结构化数据类型对象
grade = np.dtype([
('name', 'S32'),
('age', 'i'),
('chinese', 'f'),
('math', 'f'),
('english', 'f'),
])
grades = np.array([
("WangFei", 15, 86, 90, 85),
("ChenChen", 16, 87, 91, 75),
("ZhangYao", 15, 86, 90, 85),
], grade)
print(grades)
print(f"结构化数据类型后:{grades.dtype}")
# 输出结果:[('name', 'S32'), ('age', '<i4'), ('chinese', '<f4'), ('math', '<f4'), ('english', '<f4')]
4. 总结
通过这一小节的学习,我们主要掌握了以下内容:
- 什么是ndarray数组对象,它和普通的数组有什么不同?
- ndarray中的常用属性:
shape
、ndim
、size
、dtype
- 如何使用
astype
方法强转数据类型? - 如何使用
dtype
方法自定义结构化数据,避免普通数组只能存储同一数据类型带来的不适?
5. 示例代码
这篇文章的示例代码汇总如下:
import numpy as np
arr = np.array([
[1, 2, 3],
[4, 5, 6],
])
# ------------------ 属性 ------------------
# shape属性:数组的形状
print(f"数组的形状:{arr.shape}") # 数组的形状:(2, 3)
# ndim 维度属性
print(f"数组的维度:{arr.ndim}") # 数组的维度:2
# size属性:数组的大小
print(f"数组的大小:{arr.size}") # 数组的大小:6
# dtype数据类型
print(f"数组的数据类型:{arr.dtype}") # 数组的数据类型:int32
# ------------------ 方法 ------------------
# astype 强制转换数据类型
print(f"原始数据类型:{arr.dtype}") # 原始数据类型:int32
new_arr = arr.astype("float")
print(f"强制转换之后的数据类型:{new_arr.dtype}") # 强制转换之后的数据类型:float64
# dtype 自定义结构化数据类型对象
grade = np.dtype([
('name', 'S32'),
('age', 'i'),
('chinese', 'f'),
('math', 'f'),
('english', 'f'),
])
grades = np.array([
("WangFei", 15, 86, 90, 85),
("ChenChen", 16, 87, 91, 75),
("ZhangYao", 15, 86, 90, 85),
], grade)
print(grades)
print(f"结构化数据类型后:{grades.dtype}")
# 输出结果:[('name', 'S32'), ('age', '<i4'), ('chinese', '<f4'), ('math', '<f4'), ('english', '<f4')]
我是张小yu,stay hungry,stay foolish。