NumPy 使用
NumPy使用
import numpy as np
数据拷贝
numpy
关于copy有三种情况,完全不复制、视图(view)或者叫浅复制(shallow copy)和深复制(deep copy)。
而 b = a[:]
这种形式就属于第二种,即视图,这本质上是一种切片操作(slicing),所有的切片操作返回的都是视图。具体来说,b = a[:]
会创建一个新的对象 b(所以 id(b) 和id(a) 返回的结果是不一样的),但是 b 的数据完全来自于a,和 a 保持完全一致,换句话说,b的数据完全由a保管,他们两个的数据变化是一致的,可以看下面的示例:
a = np.arange(4) # array([0, 1, 2, 3])
b = a[:] # array([0, 1, 2, 3])
b.flags.owndata # 返回 False,b 并不保管数据
a.flags.owndata # 返回 True,数据由 a 保管
# 改变 a 同时也影响到 b
a[-1] = 10 # array([0, 1, 2, 10])
print(b) # array([0, 1, 2, 10])
# 改变 b 同时也影响到 a
b[0] = 10 # array([10, 1, 2, 10])
print(a) # array([10, 1, 2, 10])
b = a
和 b = a[:]
的差别就在于后者会创建新的对象,前者不会。两种方式都会导致 a
和 b
的数据相互影响。
要想不让 a
的改动影响到 b
,可以使用深复制:
unique_b = a.copy()
矩阵运算
矩阵乘法
"""
元素乘法:np.multiply(a,b) a*b
矩阵乘法:np.dot(a,b) 或 np.matmul(a,b) 或 a.dot(b) 或直接用 a @ b !
唯独注意:*,在 np.array 中重载为元素乘法,在 np.matrix 中重载为矩阵乘法!
"""
矩阵取逆
a = np.array([[1, 2], [3, 4]]) # 初始化一个非奇异矩阵(数组)
print(np.linalg.inv(a)) # 对应于MATLAB中 inv() 函数
# 矩阵对象可以通过 .I 更方便的求逆
A = np.matrix(a)
print(A.I)
正态分布的随机数数组
# loc - 正态分布的均值
# scale - 正态分布的标准差
# size - 返回数组的形状。
x = np.random.normal(loc=1, scale=2, size=(2, 3))
从数值范围创建数组
numpy.arange
numpy.arange(start, stop, step, dtype)
"""
start 起始值,默认为0
stop 终止值(不包含)
step 步长,默认为1
dtype 返回ndarray的数据类型,如果没有提供,则会使用输入数据的类型。"""
numpy.linspace
函数用于创建一个一维数组,数组是一个等差数列构成的,格式如下:
np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
"""
start 序列的起始值
stop 序列的终止值,如果endpoint为true,该值包含于数列中
num 要生成的等步长的样本数量,默认为50
endpoint 该值为 true 时,数列中包含stop值,反之不包含,默认是True。
retstep 如果为 True 时,生成的数组中会显示间距,反之不显示。
dtype ndarray 的数据类型"""
numpy.logspace
np.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None)
"""
start 序列的起始值为:base ** start
stop 序列的终止值为:base ** stop。如果endpoint为true,该值包含于数列中
num 要生成的等步长的样本数量,默认为50
endpoint 该值为 true 时,数列中中包含stop值,反之不包含,默认是True。
base 对数 log 的底数。 base 参数意思是取对数的时候 log 的下标。
dtype ndarray 的数据类型"""
示例
a = np.logspace(1.0, 2.0, num = 10) # 默认底数是 10
print (a)
输出
[ 10. 12.91549665 16.68100537 21.5443469 27.82559402
35.93813664 46.41588834 59.94842503 77.42636827 100. ]
更改数据类型
import numpy as np
arr = np.array([1,2,3,4,5])
print(arr.dtype)
float_arr = arr.astype(np.float64)
print(float_arr.dtype)
交换行(列)
test = np.array([[1, 2, 1], [3, 4, 5], [1, 2, 3]])
print(test)
test1 = test[(0, 2, 1), :] # 交换行
print(test1)
test2 = test[:, (0, 2, 1)] # 交换列
print(test2)
添加一行、一列
# -*- coding: UTF-8 -*-
import numpy as np
# 创建数组arr
arr = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
print('第1个数组arr:', arr)
print('向arr数组添加元素:')
print(np.append(arr, [[9, 10], [11, 12]]))
print('原数组:', arr)
print('沿轴 0(行方向) 添加元素:')
print(np.append(arr, [[9, 10, 11, 12], [11, 11, 11, 11]], axis=0))
print('沿轴 1(列方向)添加元素:')
print(np.append(arr, [[9, 10], [11, 12]], axis=1))
获取一列、一行
import numpy as np
a=np.arange(9).reshape(3,3)
print(a[1]) #某列
ptint(a[:,1]) #某列
删除某行,某列
x = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
x1 = np.delete(x, 1, axis=0) # axis=0 删除某行
print(x1)
x2 = np.delete(x, [1,2], axis=1) # axis=1 删除多列
print(x2)
x3 = np.delete(x, 1, axis=None) # axis = None:表示把数组按一维数组平铺在进行索引删除
print(x3)
行列拼接
a = np.array([[1, 2, 3], [4, 5, 6]])
b = np.array([[11, 21, 31], [7, 8, 9]])
c1 = np.concatenate((a, b), axis=0) # 合并行 默认情况下,axis=0可以不写
print(c1)
c2 = np.concatenate((a, b), axis=1) # 合并列
print(c2)
转置
arr = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
print(arr)
print(arr.T) # 方式一
print(np.transpose(arr)) # 方式二
空数组
np.empty(shape=(0))
np.empty(shape=(0, 4))
取整函数
函数名 | 功能 |
---|---|
numpy.ceil(x,) | 向正无穷取整 |
numpy.floor(x,) | 向负无穷取整 |
numpy.trunc/fix(x,) | 截取整数部分 |
numpy.rint(x,) | 四舍五入到最近整数 |
numpy.around(x,decimals=0) | 四舍五入到给定的小数位 |
ones_like、zeros_like
生成形状、数据类型一样的全一、全零数组
>>> x = np.arange(6)
>>> x = x.reshape((2, 3))
>>> x
array([[0, 1, 2],
[3, 4, 5]])
>>> np.ones_like(x)
array([[1, 1, 1],
[1, 1, 1]])
>>> np.zeros_like(x)
array([[0, 0, 0],
[0, 0, 0]])
>>> y = np.arange(3, dtype=float)
>>> y
array([0., 1., 2.])
>>> np.ones_like(y)
array([1., 1., 1.])
>>> np.zeros_like(y)
array([0., 0., 0.])