【Python】NumPy 库

1 引入

目的如下。

处理多维数组。

一般引用名称为 np

import numpy as np

1.1 ndarray 数组与 list 列表的区别

1.1.1 局限

数组要求相同类型。

1.1.2 优势

  1. 矢量运算
  2. 运算时有广播能力
  3. 速度快
  4. 内存少
import numpy as np
a = [1, 2, 3]
b = [2, 4, 6]
c = np.array([1, 2, 3])
d = np.array([2, 4, 6])
print(a + b)  # [1, 3, 5, 2, 4, 6]
print(c + d)  # [3 6 9]

1.2 创建数组

1.2.1 array 函数

使用 array 函数。可以用 ndmin 指定其维度。值得注意的是,此时创建的类型不是列表list,而是数组numpy.ndarray。

import numpy as np
a = np.array([1, 2], [3, 4])
print(a)
'''
[[1 2]
 [3 4]]
'''
b = np.array([1, 2, 3, 4], admin=2)
print(b)  # [[1 2 3 4]]

1.2.2 arange 函数

可以用 arange 函数创建内容为等差数列的数组。

import numpy as np
a = np.arange(0, 10, 2)
print(a)  # [0 2 4 6 8]

1.2.3 random 函数

使用 np.random.random((m, n)) 生成 m行n列 的随机数组,内容为0~1间的浮点数。

import numpy as np
a = np.random.random((3, 2))
print(a)
'''
[[0.97770905 0.83878187]
 [0.0070722  0.9113544 ]
 [0.13058777 0.72357741]]
'''

使用 np.random.randint(x, y, size=(m, n)) 生成 m行n列 的随机数组,内容为x~y间的整数。

import numpy as np
b = np.random.randint(0, 10, size=(3, 2))
print(b)
'''
[[5 5]
 [7 3]
 [4 0]]
'''

1.2.4 zeros, ones, full 函数

可以创建一个全为零、一或指定值的数组。

import numpy as np
m = 2  # row
n = 3  # column
a = np.zeros((m, n))
b = np.ones((m, n))
c = np.full((m, n), 8)
print(a)
'''
[[0. 0. 0.]
 [0. 0. 0.]]
'''
print(b)
'''
[[1. 1. 1.]
 [1. 1. 1.]]
'''
print(c)
'''
[[8 8 8]
 [8 8 8]]
'''

1.2.5 eye 函数

生成一个对角线为 1,其他为 0 的数组。

import numpy as np
a = np.eye(3)
print(a)
'''
[[1. 0. 0.]
 [0. 1. 0.]
 [0. 0. 1.]]
'''

2 结构化数据类型

2.1 数据类型

名称描述简写
bool_布尔?
int_整数i4
int8整数i1 或 b
int16整数i2
int32整数i4
int64整数i8
uint8无符号整数u1
uint16无符号整数u2
uint32无符号整数u4
uint64无符号整数u8
float_双精度浮点数f8
float16半精度浮点数f2
float32单精度浮点数f4 或 f
float64双精度浮点数f8 或 d
complex_128位复数c16
complex64复数,双32位浮点c8
complex128复数,双32位浮点c16
string字符串S

*注:S10表示一个10位的字符串,且储存时为编码形式。

2.2 定义数据类型

使用 dtype 函数定义数据类型。

import numpy as np
dt1 = np.dtype(np.int32)
dt2 = np.dtype('i4')
print(dt1)  # int32
print(dt2)  # int32

也可以定义字段和数据类型。如果要取出字符串,则需要解码。

import numpy as np

dt = np.dtype([("name", 'S20'), ("salary", 'f2'), ("age", 'i1')])
mate = np.array([("LiHua", 53.4, 17), ("John", 21.5, 18)], dtype=dt)

print(mate[1]['name'])  # b'John'
print(mate[1]['name'].decode('utf-8'))  # John

需要注意的是,如果类型是字符串,则会将非字符串的内容转化为字符串。

import numpy as np

a = np.array([1, 2, 3, 4], dtype='S10')
print(a)  # [b'1' b'2' b'3' b'4']

2.3 修改数据类型

可以用 astype 函数修改数组的数据类型。

import numpy as np

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

b = a.astype('f2')
print(b)  # [1. 2. 3.]

3 增删改查

3.1 数组维度

使用 ndim 函数获取数组维度。

import numpy as np

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

3.2 数组形状

3.2.1 shape 函数

使用 shape 函数查询数组几行几列,以元组形式返回。元组的元素从左到右分别是数组的中括号由外到内的元素数。

import numpy as np

a = np.array([[1, 2], [3, 4], [5, 6]])
print(a.shape)  # (3, 2)

3.2.2 reshape 函数

可以使用 reshape 函数。使用时必须确保改后元素总数不变。

import numpy as np

a = np.array([[[1, 2], [2, 3]], [[3, 4], [5, 6]]])
b = a.reshape(2, 4)
print(b)
'''
[[1 2 2 3]
[3 4 5 6]]
'''

3.2.3 数组扁平化

可以使用 reshape(-1) 实现。

import numpy as np

a = np.array([[[1, 2], [2, 3]], [[3, 4], [5, 6]]])
b = a.reshape(-1)
print(b)  # [1 2 2 3 3 4 5 6]

可以使用 flatten 函数,此时返回数组的拷贝,对拷贝所做的修改不影响原始数组。

import numpy as np

a = np.array([[[1, 2], [2, 3]], [[3, 4], [5, 6]]])
b = a.flatten()
print(b)  # [1 2 2 3 3 4 5 6]

可以使用 ravel() 函数,此时返回展开数组,对其所做的修改会影响原始数组。

import numpy as np

a = np.array([[[1, 2], [2, 3]], [[3, 4], [5, 6]]])
b = a.ravel()
print(b)  # [1 2 2 3 3 4 5 6]
b[1] = 114514
print(a)
'''
[[[1 114514]
  [2 3]]
 [[3 4]
  [5 6]]]
'''

3.3 flat 数组元素迭代器

flat 属性是数组元素迭代器。

import numpy as np

a = np.arange(9).reshape(3, 3)
print(f"Original:\n{a}")
print("________________")
print("Every row:")
for row in a:
	print(row)
print("________________")
print("Iterated array:")
for item in a.flat:
    print(item)
'''
Original:
[[0 1 2]
 [3 4 5]
 [6 7 8]]
________________
Every row:
[0 1 2]
[3 4 5]
[6 7 8]
________________
Iterated array:
0
1
2
3
4
5
6
7
8
'''

3.4 元素个数和内存大小

3.4.1 size 属性

使用 size 属性查询元素个数。

import numpy as np

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

3.4.2 itemsize 属性

使用 itemsize 属性查看每个元素所占字节数。

import numpy as np

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

3.4.3 nbytes 属性

将两者相乘可以查询数组中的元素所占总内存数,也可以用 nrbytes 属性查询,两者是等效的。

import numpy as np

a = np.array([1, 2, 3, 4, 5])
print(a.size * a.itemsize)  # 20
print(a.nbytes)  # 20

3.4.4 sys.getsizeof 函数

如果要查询整个数组所占内存,即包括数组这个容器和元素所占的内存,则使用 sys 库中的 getsizeof 函数。

import numpy as np
import sys

a = np.array([1, 2, 3, 4, 5])
print(sys.getsizeof(a))  # 132

b = np.array([])
print(sys.getsizeof(b))  # 112

3.5 索引和切片

3.5.1 一维数组

与列表list操作相同。

3.5.2 二维数组

获取某行某列数据有两种形式。

import numpy as np

a = np.array([
    [1, 2],
    [3, 4],
    [5, 6],
    [7, 8]
])

print(a[2, 1])  # 6
print(a[2][1])  # 6

如果要同时获取多个元素,则将元素的行索引和列索引各自列为列表,且返回一个数组。

import numpy as np

a = np.array([
    [1, 2],
    [3, 4],
    [5, 6],
    [7, 8]
])

print(a[[1, 2], [0, 1]])  # [3 6]

如果要获取某几行的数据,则使用2个中括号。

import numpy as np

a = np.array([
    [1, 2],
    [3, 4],
    [5, 6],
    [7, 8]
])

print(a[[0, 2]])
'''
[[1 2]
 [5 6]]
'''

进行切片时,也可以用 [r1:r2:r, c1:c2:c] 的形式。

import numpy as np

a = np.array([
    [1, 2],
    [3, 4],
    [5, 6],
    [7, 8]
])

print(a[:, 1])  # [2 4 6 8]
print(a[::2, 0])  # [1 5]
print(a[[1, 3], :])
'''
[[3 4]
 [7 8]]
'''
print(a[-3:-5:-1, ::-1])
'''
[[4 3]
 [2 1]]
'''

3.5.3 布尔索引

创建一个与原始数组元素数量相同的布尔数组 (或列表),将此布尔数组作为原始数组的索引,则会返回所有 True 的元素,以数组的形式呈现。

import numpy as np

arr = np.arange(7)
b = [True, False, True, False, False, False, True]
print(arr[b])  # [0 2 6]

使用数组的判断句,将会返回相应的布尔数组。

import numpy as np

arr = np.arange(1, 6)
print(arr > 3)  # [False False False  True  True]
  • 30
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值