NDARRAY对象
任何的Numpy的数据对象都是一个N维数组。最基础的创建方式是:
numpy.array(object, dtype=None, copy=True, order=None, subok=False, ndmin=0)
各个参数的说明:
ARRAY属性
ndarry.shape
返回一个tuple代表数组的形状。或者用来改变数组的形状。
import numpy as np
a = np.array([[1, 2, 3], [4, 5, 6]])
print(a)
print(a.shape)
a.shape = (3, 2)
print(a)
print(a.shape)
b = a.reshape(2, -1)
print(b)
输出结果:
[[1 2 3]
[4 5 6]]
(2, 3)
[[1 2]
[3 4]
[5 6]]
(3, 2)
[[1 2 3]
[4 5 6]]
改变形状也可以用reshape操作。但是reshape不是直接在原来的数组上进行操作,而是返回一个新的数组。-1表示根据实际情况进行计算。
ndarry.ndim
返回数组的维数。
python
print(a.ndim)
输出2
创建ARRAY
主要是下面这三个:
numpy.empty(shape, dtype=float, order='C') # 空数组,值是任意的
numpy.zeros(shape, dtype=float, order='C') # 全0数组
numpy.ones(shape, dtype=float, order='C') # 全1数组
‘C’代表是C语言风格,一般不用
从现有的数据中创建ARRAY
numpy.asarray(a, dtype=None, order=None)
参数说明:
import numpy as np
l = [1, 2, 3]
a = np.asanyarray(l, dtype=float)
print(a)
l1 = (1, 2, 3)
b = np.asanyarray(l1, dtype=int)
print(b)
l2 = [(1, 2, 3), (4, 5)]
c = np.asanyarray(l2)
print(c)
输出结果:
[1. 2. 3.]
[1 2 3]
[(1, 2, 3) (4, 5)]
根据数据范围创建ARRAY
numpy.arange
numpy.arange(start, stop, step, dtype)
参数说明:
import numpy as np
x = np.arange(5)
print(x)
x = np.arange(5, dtype=float)
print(x)
x = np.arange(10, 20, 2)
print(x)
结果:
[0 1 2 3 4]
[0. 1. 2. 3. 4.]
[10 12 14 16 18]
numpy.linspace
numpy.linespace(start, stop, num, endpoint, retstep, dtype)
参数说明:
一般运算和矩阵运算
一般运算
一般的数组间的运算,一般的运算,要求两个数组的形状都是一样的。进行的操作是每个对应的元素的。而且不是直接在原来的数据上进行运算,而是返回一个新的数组。
import numpy as np
a = np.array([[1., 2., 3.], [4., 5., 6.]])
b = np.array([[-3., -2., -1.], [-6., -5., -4.]])
# 都是对应元素的操作
print(np.add(a, b))
print(np.subtract(a, b))
print(np.multiply(a, b))
print(np.divide(a, b))
print(np.reciprocal(a)) # 倒数
print(np.power(b, a)) # b^a
print(np.sin(a))
输出结果:
[[-2. 0. 2.]
[-2. 0. 2.]]
[[ 4. 4. 4.]
[10. 10. 10.]]
[[ -3. -4. -3.]
[-24. -25. -24.]]
[[-0.33333333 -1. -3. ]
[-0.66666667 -1. -1.5 ]]
[[1. 0.5 0.33333333]
[0.25 0.2 0.16666667]]
[[-3.000e+00 4.000e+00 -1.000e+00]
[ 1.296e+03 -3.125e+03 4.096e+03]]
[[ 0.84147098 0.90929743 0.14112001]
[-0.7568025 -0.95892427 -0.2794155 ]]
矩阵运算
在numpy中,一般用一维数组表示向量,二维数组表示矩阵,多维数组表示张量。一维数组默认为行向量。之后借助numpy的线性代数库解决问题。
一般举例:
import numpy as np
a = np.array([[1, 2], [3, 4]])
b = np.array([[11, 12], [13, 14]])
x = [3, 4]
print(np.dot(a, b)) # 二维情况下就是矩阵乘法
print(np.vdot(a, b)) # 对应行向量的内积的累加和 1*11 + 2*12 + 3*13 + 4*14 = 130
# 一维情况表示内积,多维情况表示交叉的内积
print(np.inner(a, b))
'''
1*11+2*12, 1*13+2*14
3*11+4*12, 3*13+4*14
'''
print(np.linalg.det(a)) # 计算行列式
print(np.linalg.solve(a, b)) # ax=b 求解x
print(np.linalg.inv(a)) # 逆矩阵
BROADCAST广播机制
一种更加高效的数组(张量)运算机制,减少了数据复制的步骤。这篇文章详细介绍了一些基本概念。
简单来说,python把数组进行伸展,然后进行计算。进行广播需要满足下列两个先决条件中的至少一个:
- 两个张量的trailing axes必须一致
- 两个张量之中的至少一个张量的的axes必须是1
假设有一个RGB图片,有3个channel,我们想要把每个channel的图层进行不同的数据添加,可以用这种方式:
Image (3d array): 256 x 256 x 3
Scale (1d array): 3
Result (3d array): 256 x 256 x 3
或者一个高维的张量,虽然两者的trailing axes的不同,但是有一个维数是1,所以可以进行BROADCAST:
A (4d array): 8 x 1 x 6 x 1
B (3d array): 7 x 1 x 5
Result (4d array): 8 x 7 x 6 x 5
几个例子:
from numpy import array
a = array([[0.0, 0.0, 0.0],
[10.0, 10.0, 10.0],
[20.0, 20.0, 20.0],
[30.0, 30.0, 30.0]])
b = array([1., 2., 3.])
print(a + b)
输出结果:
[[ 1. 2. 3.]
[11. 12. 13.]
[21. 22. 23.]
[31. 32. 33.]]
伸展过程如下:
下面这种就不能通过:
另一种方式:
from numpy import array, newaxis
a = array([0.0,10.0,20.0,30.0])
b = array([1.0,2.0,3.0])
print(a[:,newaxis] + b)
输出结果:
[[ 1. 2. 3.]
[11. 12. 13.]
[21. 22. 23.]
[31. 32. 33.]]
伸展过程: