Numpy 笔记:Python 数组函数总结

Numpy Note: Python's Array Function Collection

Posted by J Leaves on November 30, 2018

数组初始化

从列表创建矩阵

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

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

以上两个函数将结构数据转化为ndarray。

主要区别:当数据源是ndarray时,array仍然会copy出一个副本,占用新的内存,但asarray不会。

1
2
3
import numpy as np
a = np.array([1, 2])
np.asarray(a) is a

True

创建单位矩阵

numpy.eye (N, M=None, k=0, dtype=<class ‘float’>, order=’C’)

N : int 矩阵的行。

M : int, 可选 矩阵的列。如果未指定,默认为N

k : int, 可选 对角线的位置,即1所在的斜线。默认值为0(即主对角线)。正值指上对角线,负值指下对角线。

dtype : data-type, 可选 数组元素的数据类型。

order : {‘C’, ‘F’}, 可选 指定应在内存中以行优先(C风格),或列优先(Fortran风格)的顺序存储数组。默认为’C’。

返回值 : numpy.ndarray 生成的 Ndarray 数组。

创建全1矩阵/向量

numpy.ones (shape, dtype=None, order=’C’)

shape : int / int 序列 新阵列的形状。例如,(2, 3) 2(2,) (分别生成2*3矩阵,2维向量,2维向量)

dtype : data-type, 可选 数组元素的数据类型。默认为 numpy.float64.

order : {‘C’, ‘F’}, 可选 指定应在内存中以行优先(C风格),或列优先(Fortran风格)的顺序存储数组。默认为’C’。

创建元素均匀间隔的矩阵

numpy.arange ([start, ]stop, [step, ]dtype=None)

start, stop, step 均可为小数。

1
2
3
import numpy as np
a = np.arange(0, 30, 2)
b = a.reshape(3, 5)

a = [ 0 2 4 6 8 10 12 14 16 18 20 22 24 26 28]

b = [[ 0 2 4 6 8] [10 12 14 16 18] [20 22 24 26 28]]

 

数组排序

list.sort (*, key=None, reverse=False)

适用于 list,返回值为排序后的 list。

sorted (iterable, *, key=None, reverse=False)

适用于任何可迭代对象,返回值为排序后的 list。

1
sorted({1: 'D', 2: 'B', 3: 'B', 4: 'E', 5: 'A'})

[1,2,3,4,5]

返回排好序的数组

使用 list.sort()sorted

返回排好序的下标数组

用于 list:

1
2
a = [1, 20, 4, 6, 17]
b = sorted(range(len(a)), key=lambda x: a[x])

b = [0, 2, 3, 4, 1] <class ‘list’>

同样可以用于 Numpy 数组:

1
2
3
import numpy as np
c = np.asarray([1, 20, 4, 6, 17])
d = sorted(range(c.shape[0]), key=lambda x: a[x])

d = [0, 2, 3, 4, 1] <class ‘list’>

 

数组元素操作

对符合条件的部分元素进行操作

方法一 (对自身进行操作)

负数取0:

1
2
3
import numpy as np
a = np.asarray([-1, 0, -0.5, 3, 4, 2.3])
a[a < 0] = 0

a = [0. 0. 0. 3. 4. 2.3] <class ‘numpy.ndarray’>

负数加10:

1
2
3
import numpy as np
a = np.asarray([-1, 0, -0.5, 3, 4, 2.3])
a[a < 0] += 10

a = [9. 0. 9.5 3. 4. 2.3] <class ‘numpy.ndarray’>

方法二 可以用于更多操作(不改变自身数组,返回新数组)

超过1的数取1:

1
2
3
import numpy as np
a = np.asarray([-1, 0, -0.5, 3, 4, 2.3])
b = np.where(a < 1, a, 1)

a = [-1. 0. -0.5 3. 4. 2.3] <class ‘numpy.ndarray’>

b = [-1. 0. -0.5 1. 1. 1. ] <class ‘numpy.ndarray’>

 

数组行列操作

数组提取某几行或某几列

提取某几行:

1
2
3
4
5
import numpy as np
a = np.asarray([[1,2,3,4], [5,6,7,8], [9,10,11,12], [13,14,15,16]])
b = a[1, :]
c = a[(0,2), :]
d = a[range(3), :]

b = [5 6 7 8] <class ‘numpy.ndarray’>

c = [[ 1 2 3 4] [ 9 10 11 12]] <class ‘numpy.ndarray’>

d = [[ 1 2 3 4] [ 5 6 7 8] [ 9 10 11 12]] <class ‘numpy.ndarray’>

提取某几列同理。

矩阵转置

numpy.transpose (a, axes=None)

a : array_like

要转置的矩阵。

axes : list of ints, optional

默认将维度倒置(二维情况下即转置)。若给出,按给出的方式转变矩阵的维度。

1
2
3
import numpy as np
x = np.ones((1, 2, 3))
np.transpose(x, (1, 0, 2)).shape

(2, 1, 3)

numpy.ndarray.T

与 numpy.transpose 效果相同。

注意

对于一维向量,以上函数无法实现行向量和列向量的相互转化。

行向量 -> 列向量

使用 np.reshape(a, (-1,1)) 或者 a.reshape(-1, 1)

列向量 -> 行向量

使用 np.transpose()

 

数组输出

输出数组序号与元素值

使用 enumerate 函数。

1
2
3
items = [8, 23, 45, 12, 78]
for index, item in enumerate(items):
    print(index, item)

0 8 1 23 2 45 3 12 4 78

(参考:How to loop with indexes in Python )

知识共享许可协议

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可