Python 多维数组详解(numpy)

发布时间:2023年12月20日

1 概述

1.1 numpy 简介

  • numpy:Numerical Python(数值表示的 Python),支持大量的维度数组与矩阵运算,此外也提供了大量的数学函数库。
  • 底层算法:使用了 C 语言,所以运算速度快。

安装 numpy:(第三方库)

pip install numpy

示例:

import numpy as np

a = np.array([1, 2, 3])
print(a)  # [1 2 3]

# 返回值类型 ndarray
print(type(a))  # <class 'numpy.ndarray'>

1.2 ndarray 简介

ndarray 主要有以下特点

  • 元素索引:元素下标从 0 开始。
  • 元素类型:元素类型完全相同。(若元素类型不同,按优先级 str > float > int 自动转换)
  • 内存空间:元素所占内存空间一样大。
import numpy as np

# 示例:一维数组
a = np.array([1, 2, 3])

# 元素索引:从 0 开始
print(f'下标为 0 的元素:{a[0]}')  # 1
print(f'下标为 1 的元素:{a[1]}')  # 2
print(f'下标为 2 的元素:{a[2]}')  # 3

# 元素类型:完全一样
print(f'下标为 0 的元素类型:{a[0].dtype}')  # int32
print(f'下标为 1 的元素类型:{a[1].dtype}')  # int32
print(f'下标为 2 的元素类型:{a[2].dtype}')  # int32

# 元素内存空间:完全一样
print(f'下标为 0 的元素内存空间:{a[0].itemsize}')  # 4
print(f'下标为 1 的元素内存空间:{a[1].itemsize}')  # 4
print(f'下标为 2 的元素内存空间:{a[2].itemsize}')  # 4

元素类型转换示例:

import numpy as np

# 示例:一维数组
# 1 和 2 是 int, 3.5 是 float
a = np.array([1, 2, 3.5])

print(a)  # [1.  2.  3.5]
print(f'下标为 0 的元素类型:{a[0].dtype}')  # float64
print(f'下标为 1 的元素类型:{a[1].dtype}')  # float64
print(f'下标为 2 的元素类型:{a[2].dtype}')  # float64

2 数组操作

2.1 创建数组:array()

语法格式:

numpy.array(object,  # 数组的输入数据。可以是列表、元组、数组等
            dtype=None,  # 生成数组的数据类型
            copy=True,  # 是否复制
            order=None,  # 是否排序(内存,C:按行方向,F:按列方向,A:任意方向,k:默认数据输入时方向)
            subok=False,  # 是否返回子类数组
            ndmin=0  # 生成数组的维度
            )

#  重点关注:dtype、ndmin
#  copy、order、subok 了解即可,与内存存储相关,一般不使用
import numpy as np

# 创建一维数组
a = np.array([1, 2, 3])
print(a)

# 创建二维数组
b = np.array([[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9]])
print(b)

# 创建结构化数据的数组
student = np.dtype([('name', 'S10'), ('age', 'i1'), ('sex', 'f4')])
c = np.array([('张三', 21, '女'), ('李四', 18, '男')])
print(c)
# [['张三' '21' '女']
#  ['李四' '18' '男']]


# 其它内置创建数组的函数,此处仅举例部分
# 示例:创建给定数组范围的数组:arange()
d = np.arange(start=1,  # 起点(默认 0)
              stop=5,  # 终点(不包含)
              step=1,  # 步长(默认 1)
              dtype=np.int_  # 返回数据的类类型(自动判断)
              )
print(d)  # [1 2 3 4]

2.2 裁切数组:切片

  • 同字符串的 切片
  • [start: end: step]
    • start:起点索引,包含
    • end:终点索引,不包含,默认所有
    • step:步长,默认 1
import numpy as np

# 示例1:一维数组
a = np.array([1, 2, 3, 4, 5])

# 裁切 索引1 到 索引4 的元素,步长为 1
print(a[1:4:1])  # [2 3 4]
# 裁切 索引1 到 结尾的元素,步长为 2
print(a[1::2])  # [2 4]

# 示例2:二维数组
b = np.array([[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9]])

# 裁切 横索引1、纵索引1:3 的元素
print(b[1, 1:3])  # [5 6]

2.3 拼接数组:concatenate()

import numpy as np

# 示例1:连接一维数组
a1 = np.array([1, 2, 3])
a2 = np.array([4, 5, 6])
a = np.concatenate((a1, a2))
print(a)  # [1 2 3 4 5 6]

# 示例2:沿着对称轴(axis=1)连接二维数组
b1 = np.array([[1, 2],
               [3, 4]])
b2 = np.array([[5, 6],
               [7, 8]])
print(np.concatenate((b1, b2), axis=1))
# [[1 2 5 6]
#  [3 4 7 8]]

2.4 拆分数组:array_split()

import numpy as np

# 示例1:一维数组
a = np.array([1, 2, 3, 4, 5, 6])
new_a = np.array_split(a, 3)
print(new_a)
# [array([1, 2]), array([3, 4]), array([5, 6])]

# 示例2:二维数组
b = np.array([[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9]])
new_b = np.array_split(b, 2)
print(new_b)
# [array([[1, 2, 3],
#        [4, 5, 6]]), array([[7, 8, 9]])]

print(np.array_split(b, 2, axis=1))  # 沿对称轴拆分
# [array([[1, 2],
#        [4, 5],
#        [7, 8]]), array([[3],
#        [6],
#        [9]])]

2.5 改变数组形状:reshape()

import numpy as np

a = np.arange(12)

print(a)
# [ 0  1  2  3  4  5  6  7  8  9 10 11]

# 示例:由原 一维数组 变为 二维数组(3行4列)
b = a.reshape((3, 4))
print(b)
# [[ 0  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]]

3 元素操作

3.1 获取元素:通过索引

import numpy as np

# 一维数组
a = np.array([1, 2, 3])
print(f'获取下标索引为 0 的元素:{a[0]}')  # 1
print(f'获取下标索引为 1 的元素:{a[1]}')  # 2
print(f'获取下标索引为 2 的元素:{a[2]}')  # 4

# 二维数组
b = np.array([[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9]])
print(f'获取下标索引为 0,0 的元素:{b[0][0]}')  # 1。写法1
print(f'获取下标索引为 1,0 的元素:{b[1, 0]}')  # 4。写法2

在这里插入图片描述

3.2 获取元素:通过迭代器 nditer()

import numpy as np

# 示例1:一维数组
a = np.array([1, 2, 3, 4, 5, 6])

for x in np.nditer(a):
    print(x, end=", ")  # 1, 2, 3, 4, 5, 6, 

print()
# 示例2:二维数组
b = np.array([[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9]])

for x in np.nditer(b):
    print(x, end=", ")  # 1, 2, 3, 4, 5, 6, 7, 8, 9, 

3.3 获取元素及索引:ndenumerate()

import numpy as np

# 示例1:一维数组
a = np.array([1, 2, 3, 4, 5, 6])

for idx, x in np.ndenumerate(a):
    print(idx, x, end=", ")
# (0,) 1, (1,) 2, (2,) 3, (3,) 4, (4,) 5, (5,) 6,

print()
# 示例2:二维数组
b = np.array([[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9]])

for idx, x in np.ndenumerate(b):
    print(idx, x, end=", ")
# (0, 0) 1, (0, 1) 2, (0, 2) 3, 
# (1, 0) 4, (1, 1) 5, (1, 2) 6, 
# (2, 0) 7, (2, 1) 8, (2, 2) 9,

3.4 搜索元素:where()

import numpy as np

a = np.array([0, 1, 2, 3, 3, 5])
x = np.where(a == 3)
print(f'出现元素 3 的索引:{x}')  # (array([3, 4], dtype=int32),)
print(f'元素值为偶数的索引;{np.where(a%2 == 0)}')  # (array([0, 2], dtype=int32),)

3.5 元素排序:sort()

import numpy as np

a = np.array([0, 1, 2, 4, 3, 5])
b = np.sort(a)  # b 是 a 的副本,不影响 a 的元素
print(b)  # [0 1 2 3 4 5]

3.6 元素过滤:过滤器

import numpy as np

a = np.array([0, 1, 2, 4, 3, 5])

# 过滤器:仅保留 >= 3 的元素
filter_a = a >= 3
new_a = a[filter_a]
print(new_a)  # [4 3 5]

3.7 行列互换:transponse()

import numpy as np

a = np.arange(12).reshape(3, 4)
print(a)
# [[ 0  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]]

b = np.transpose(a)
print(b)
# [[ 0  4  8]
#  [ 1  5  9]
#  [ 2  6 10]
#  [ 3  7 11]]

# 利用属性,效果同上
c = a.T
print(c)

4 扩展

4.1 元素类型:dtype

类型字符代码描述
bool_b布尔型(True、False)
int_i整数(默认,类似 C 语言中的 long、int32 或 int64)
intc与 C 的 int 类型一样,一般是 int32 或 int64
intp用于索引的整数(类似 C 语言中的 ssize_t,一般是 int32 或 int64)
int8i1字节数( ? 2 7 -2^7 ?27 to 2 7 ? 1 2^7-1 27?1
int16i2字节数( ? 2 15 -2^{15} ?215 to 2 15 ? 1 2^{15}-1 215?1
int32i4字节数( ? 2 31 -2^{31} ?231 to 2 31 ? 1 2^{31}-1 231?1
int64i8字节数( ? 2 63 -2^{63} ?263 to 2 63 ? 1 2^{63}-1 263?1
uint8u1无符号整数( 0 0 0 to 2 8 ? 1 2^{8}-1 28?1
uint16u2无符号整数( 0 0 0 to 2 16 ? 1 2^{16}-1 216?1
uint32u4无符号整数( 0 0 0 to 2 32 ? 1 2^{32}-1 232?1
uint64u8无符号整数( 0 0 0 to 2 64 ? 1 2^{64}-1 264?1
float_float64 类型的简写
float16f2半精度浮点数。1个符号位,5个指数位,10个尾数位
float32f4单精度浮点数。1个符号位,8个指数位,23个尾数位
float64f8双精度浮点数。1个符号位,11个指数位,52个尾数位
complex_complex 128 类型的简写
complex64c8复数,表示双 32 位浮点数
complex128c16复数,表示双 64 位浮点数
string_S固定长度字符串,如:S10,长度为 10
objectOPython 对象类型

4.2 数组属性

import numpy as np

a = np.array([1, 2, 3])
print(a)  # [1 2 3]
print(f'维度数量 ndim={a.ndim}')
print(f'元素总数 size={a.size}')
print(f'元素形状 shape={a.shape}')  # 行 * 列 = 总数
print(f'元素类型 dtype={a.dtype}')
print(f'元素大小 itemsize={a.itemsize}')  # 单位:字节
print(f'内存标志 flags={a.flags}')
print(f'元素实部 real={a.real}')
print(f'元素虚部 imag={a.imag}')
print(f'元素缓冲 data={a.data}')
文章来源:https://blog.csdn.net/qq_34745941/article/details/135006115
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。