numpy使用tips
numpy存在两种不同的数据类型——矩阵matrix和数组array,都可以处理行列表示的数字元素, matrix与MATLAB中matrices等价
1. numpy中二维数组不支持求逆运算
可以使用scipy中的linalg.inv()函数求逆
二维ndarray替代matrix结合scipy.linalg可以实现全部矩阵运算
2. 创建np.matrix
a = np.matrix('1 2';'3 4')
>>>[[1 2]
[3 4]]
注意矩阵的换行是;隔开,内部数据以字符串形式,矩阵元素之间以空格隔开, 数据可以是数组
3. 列表转array
temp = np.array(list)
arr = temp.tolist()
4. numpy.nditer迭代数组
提供灵活访问一个或多个数组元素的方式
for x in np.nditer(a):
print(x, end=",")
控制遍历顺序
for x in np.nditer(a, order='F')# 列序优先
for x in np.nditer(a, order='C')# 行序优先
修改数组中的元素,需要指定为read-write 或 write-only模式
for x in np.nditer(a, op_flags=['readwrite']):
x[...] = 2*x # 每个元素乘以2
使用外部循环,利用flags参数
- c_index:跟踪行优先的索引
- f_index:跟踪列优先的索引
- multi_index:每次迭代跟踪一种索引类信息
- external_loop:给出的值是具有多个值的一维数组,而不是零维数组
广播迭代:两个数组可广播,则nditer组合对象可以同时迭代他们
import numpy as np
a = np.arange(0,60,5)
a = a.reshape(3,4)
print ('第一个数组为:')
print (a)
print ('\n')
print ('第二个数组为:')
b = np.array([1, 2, 3, 4], dtype = int)
print (b)
print ('\n')
print ('修改后的数组为:')
for x,y in np.nditer([a,b]):
print ("%d:%d" % (x,y), end=", " )
第一个数组为:
[[ 0 5 10 15]
[20 25 30 35]
[40 45 50 55]]
第二个数组为:
[1 2 3 4]
修改后的数组为:
0:1, 5:2, 10:3, 15:4, 20:1, 25:2, 30:3, 35:4, 40:1, 45:2, 50:3, 55:4,
5. numpy.outer 外积
a,b是两个数组,如果a,b高维则自动flatten为1维
a = [a1, …, am] and b = [ b1, …, bn]
result=[
[a1*b1, a1*b2,…,a1*bn]
[a2*b1, a2*b2,…,a2*bn]
…
[am*b1, am*b2,…,am*bn]
]
np.outer([1,2,3],[4,5,6])
np.outer([[1],[2],[3]],[4,5,6])
上面两句运行结果都是
array([[ 4, 5, 6],
[ 8, 10, 12],
[12, 15, 18]])
6. numpy.zeros_like() 创建全零的矩阵
创建一个矩阵,其维度与传入的矩阵一致,为其初始化为全0,无需参数制定shape大小
7. numpy矩阵相乘运算符@
作用相同与numpy.dot()
用于矩阵乘法
from numpy import array,dot
a=array([[1,2],
[1,2]])
b=array([[5,6],
[5,6]])
print(a@b)
print(dot(a,b))
out:
[[15 18]
[15 18]]
[[15 18]
[15 18]]
特殊用法:当第二个位置为向量时(1行n列的矩阵),则向量会转置
from numpy import array,dot
f=array([1,2]) #1*2
g=array([[1,2],
[1,2],
[1,2]]) # 3*2
print(f@g) # g不是向量无法自动转置,报错
print(g@f) # f自动转置
print(dot(g,f))
[5 5 5]
[5 5 5]
8. numpy转pandas
data = pd.DataFrames(numpy_matrix)
9. numpy.concatenate()进行矩阵的拼接
data = numpy.concatenate((a, b), axis=1)
10. 初始化赋值
arr = np.zeros((2, 3)) #初始化一个2*3的元素全为0的数组
arr = np.ones((1, 2)) #初始化一个1*2的元素全为1的数组
arr = np.full((2, 2), 8) #初始化一个2*2的元素全为8的数组
arr = np.eye(3) #初始化一个3*3 的对角线元素为1,其余全为0的数组(单位矩阵)
arr = np.random.random((3, 2)) #初始化一个3*2的,填充任意数字的数组
arr = np.empty((2, 3, 4)) #初始化一个2*3*4的数组,不填充