Numpy常用方法记录

创建数组

ndarray

numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)

1
2
3
4
5
import numpy as np 

a = np.array([1,2,3])
a = np.array([1, 2, 3, 4, 5], ndmin = 2)
a = np.array([1, 2, 3], dtype = complex)

empty

1
2
3
import numpy as np 
x = np.empty([3,2], dtype = int)
# 数组元素为随机值,未初始化

numpy.empty(shape, dtype = float, order = 'C')

ones

1
2
3
4
import numpy as np

print(np.ones(5))
print(np.ones([2, 2],dtype=int))

zeros

1
2
3
4
import numpy as np

print(np.zeros(5))
print(np.zeros([2, 2]))

numpy.asarray

numpy.asarray(a, dtype = None, order = None)

从已有数组创建数组

a可以是:列表[]、元组()、多维数组[[]]、列表元组[()]、元组的元组(())、元组的列表([])

numpy.fromiter

numpy.fromiter(iterable, dtype, count=-1)

从可迭代对象中建立ndarray对象

numpy.arange

numpy.arange(start, stop, step, dtype)

从数值范围创建数组:[start,stop)

linspace

np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)

以等差数列创建数组:默认 [start,stop]

logspace

np.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None)

以等比数列创建数组:默认 [start,stop]

数组切片

slice函数

1
2
3
a = np.arange(10)
s = slice(2,8,2)
print(a[s]) # [2,4,6]

冒号分隔切片

1
2
a = np.arange(10)
print(a[2:7:2]) # [2,4,6]

二维数组切片

1
2
3
a = np.array([[1,2,3],[3,4,5],[4,5,6]])
print(a[:,1]) # 每行索引为1的元素 [2,4,5]
print(a[1:,1:]) # 索引为1的行开始到最后的所有行,之后每行索引为1的元素到最后 [[4,5],[5,6]]

若行/列只有冒号,可以使用...代替冒号

1
2
3
a = np.array([[1,2,3],[3,4,5],[4,5,6]])
print(a[...,1]) # 每行索引为1的元素 [2,4,5]
print(a[1,...]) # 索引为1的行的所有元素 [3,4,5]

高级索引

数组索引

1
2
3
4
5
import numpy as np 

x = np.array([[1, 2], [3, 4], [5, 6]])
y = x[[0,1,2], [0,1,0]] # 选择(0,0)(1,1),(2,0)位置的元素
print (y) # [1,4,5]

布尔索引

1
2
3
4
5
6
7
8
9
import numpy as np 
x = np.array([[ 0, 1, 2],[ 3, 4, 5],[ 6, 7, 8],[ 9, 10, 11]])
print (x[x > 5]) # [6 7 8 9 1 11]

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

a = np.array([1, 2+6j, 5, 3.5+5j])
print (a[np.iscomplex(a)]) # [2. +6.j 3.5+5.j]

花式索引

1
2
3
4
5
6
7
8
9
import numpy as np

x = np.arange(9)
x2 = x[[0, 6]] # 使用花式索引
print(x2) # [0 6]

x=np.arange(32).reshape((8,4))
print (x[[4,2,1,7]]) # 二维数组中索引为4,2,1,7的行
print (x[[-4,-2,-1,-7]])

数组操作

修改数组形状

numpy.reshape(arr, newshape, order='C')

不改变数据的条件下修改形状,不改变原数组

1
2
3
4
5
6
import numpy as np

x = np.arange(8)
y = x.reshape(4,2)
print(x) # [0 1 2 3 4 5 6 7]
print(y) # [[0 1] [2 3] [4 5] [6 7]]

ndarray.flatten(order='C') 展平数组,不影响原数组

numpy.ravel(a, order='C') 展平数组,影响原数组

  • order:‘C’ – 按行,‘F’ – 按列,‘A’ – 原顺序,‘K’ – 元素在内存中的出现顺序

  • ravel以F展开时不影响原数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import numpy as np

a = np.arange(8).reshape(2,4)

b = a.flatten() # [0 1 2 3 4 5 6 7]
c = a.flatten(order="F") # [0 4 1 5 2 6 3 7]
b[0] = 1000
print(a) # [[0 1 2 3] [4 5 6 7]]


d = a.ravel() # [0 1 2 3 4 5 6 7]
d[0] = 1000
print(a) # [[1000 1 2 3] [4 5 6 7]]

翻转数组

numpy.transpose(arr, axes)

numpy.ndarray.T

1
2
3
4
5
import numpy as np

a = np.arange(12).reshape(3,4)
print(np.transpose(a))
print(a.T)

连接数组

numpy.concatenate((a1, a2, ...), axis)

1
2
3
4
5
6
7
import numpy as np

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

print (np.concatenate((a,b),axis = 1)) #[[1 2 5 6] [3 4 7 8]]

分割数组

numpy.split(ary, indices_or_sections, axis)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import numpy as np

a = np.arange(9)
print(np.split(a,3)) # [array([0, 1, 2]), array([3, 4, 5]), array([6, 7, 8])]
print(np.split(a,[4,7])) # [array([0, 1, 2, 3]), array([4, 5, 6]), array([7, 8])]

b = np.arange(16).reshape(4, 4)
print(np.split(a,2))
# [array([[0, 1, 2, 3],
# [4, 5, 6, 7]]),
# array([[ 8, 9, 10, 11],
# [12, 13, 14, 15]])]
print(np.split(a,2,1))
# [array([[ 0, 1],
# [ 4, 5],
# [ 8, 9],
# [12, 13]]),
# array([[ 2, 3],
# [ 6, 7],
# [10, 11],
# [14, 15]])]

数组元素添加与删除

numpy.resize(arr, shape)

对比reshape,以C格式读取原数组元素后,填充至指定形状新数组

1
2
3
4
5
import numpy as np

a = np.array([[1,2,3],[4,5,6]])
print(np.resize(a,(3,2))) # [[1 2] [3 4] [5 6]]
print(np.resize(a,(3,3))) # [[1 2 3] [4 5 6] [1 2 3]] 新数组>原数组,遍历完之后,从头继续遍历填充

numpy.append(arr, values, axis=None)

向数组末尾添加元素,默认返回一维数组

定义axis时,可以对二维数组按轴添加元素

1
2
3
4
5
6
7
import numpy as np

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

print (np.append(a, [7,8,9])) # [1 2 3 4 5 6 7 8 9]
print (np.append(a, [[7,8,9]],axis = 0)) # [[1 2 3] [4 5 6] [7 8 9]]
print (np.append(a, [[5,5,5],[7,8,9]],axis = 1)) # [[1 2 3 5 5 5] [4 5 6 7 8 9]]

Numpy.delete(arr, obj, axis)

按轴删除元素

1
2
3
4
5
6
7
8
9
import numpy as np

a = np.arange(12).reshape(3,4)
print(np.delete(a,5)) # [ 0 1 2 3 4 6 7 8 9 10 11] 未定义axis,先展开数组,之后删除指定索引位置元素
print(np.delete(a,1,axis = 1))
# [[ 0 2 3]
# [ 4 6 7]
# [ 8 10 11]]
print(np.delete(a,1,axis = 1)) # [[ 0 1 2 3] [ 8 9 10 11]]

numpy.unique(arr, return_index, return_inverse, return_counts)

arr:输入数组,如果不是一维数组则会展开

return_index:如果为true,返回新列表元素在旧列表中的位置(下标),并以列表形式储

return_inverse:如果为true,返回旧列表元素在新列表中的位置(下标),并以列表形式储

return_counts:如果为true,返回去重数组中的元素在原数组中的出现次数

1
2
3
4
5
6
7
8
9
10
11
12
import numpy as np

a = np.array([5,2,6,2,7,5,6,8,2,9])
print(np.unique(a)) # [2 5 6 7 8 9]
u,indices = np.unique(a, return_index = True)
print(indices) # 新列表[2 5 6 7 8 9]中每个元素在旧列表中首次出现的索引:[1 0 2 4 7 9]

u,indices = np.unique(a,return_inverse = True)
print(indices) # 旧列表[5,2,6,2,7,5,6,8,2,9]各元素在新列表[2 5 6 7 8 9]中的索引:[1 0 2 0 3 1 2 4 0 5]

u,indices = np.unique(a,return_counts = True)
print(indices) # 新列表[2 5 6 7 8 9]中各元素在原列表中出现的次数:[3 2 2 1 1 1]

NumPy 字符串函数

函数 描述
add() 对两个数组的逐个字符串元素进行连接
multiply() 返回按元素多重连接后的字符串
center() 居中字符串
capitalize() 将字符串第一个字母转换为大写
title() 将字符串的每个单词的第一个字母转换为大写
lower() 数组元素转换为小写
upper() 数组元素转换为大写
split() 指定分隔符对字符串进行分割,并返回数组列表
splitlines() 返回元素中的行列表,以换行符分割
strip() 移除元素开头或者结尾处的特定字符
join() 通过指定分隔符来连接数组中的元素
replace() 使用新字符串替换字符串中的所有子字符串
decode() 数组元素依次调用str.decode
encode() 数组元素依次调用str.encode