数组初始化
从列表创建矩阵
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 国际许可协议进行许可