1. Numpy的基石——ndarray数组

1. Numpy中的数组——ndarray

在 Numpy 中重要的内核就是 ndarray 多维数组,进行数据分析时,对数据进行运算很大程度上依赖于 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,注意都是带符号的整数
  • 浮点类型:包括float16float32float64
  • 复数类型:包括complex64complex128
  • 布尔类型:即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字符串类型
UUnicode类型
Vvoid类型

下面我们来看看如何利用 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中的常用属性:shapendimsizedtype
  • 如何使用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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张小yu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值