import numpy as np
a = np.array([1, 2, 3]) #创建一个1x3的数组
print(type(a)) #结果应该是:<type 'numpy.ndarray'>
print(a.shape) #(3,)
print(a[0], a[1], a[2]) #1,2,3
a[0]=5
print(a) #[1,2,3]
#####################其他一些创建并初始化数组的方法######################
a = np.zeros((2,2)
print(a) #输出结果为:[[0.,0.],
# [0.,0.]]
b = np.ones((1,2))
print(b) #输出结果为:[[1.,1.],
# [1.,1.]]
c = np.full((2,2), 7)
print(c) #输出结果为:[[7.,7.],
# [7.,7.]]
d = np.eye(2)
print(d) #输出结果为:[[1.,0.],
# [0.,1.]]
e = np.random.random((2,2))
print(e) #一输出结果:[[ 0.24675928,0.08179221]
# [ 0.86916875,0.67120492]]
#####################下标操作的一些常用的方法############################
a = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]]) #创建数组:
## [[ 1 2 3 4]
# [ 5 6 7 8]
# [ 9 10 11 12]]
#取a的子数组,前2行的1,2列(从0开始)
b = a[:2, 1:3] #结果为:
#[[2,3]
# [3,7]]
#子数组是原数组中的一部分,改变子数组值会相应更改原数组的值
b[0,0]=0.
print(a) #输出为:
# [[ 1 0 3 4]
# [ 5 6 7 8]
# [ 9 10 11 12]]
#取整行的操作,注意区别
row_r1 = a[1, :]
row_r2 = a[1:2, :]
print(row_r1, row_r1.shape) #[5,6,7,8] (4,)
print(row_r2, row_r2.shape) #[[5,6,7,8]] (1,4)
#整数索引
a=np.array([[1,2],[3,4],[5,6]])
print(a[[0,1,2],[0,1,0]]) #[1,4,5]前面是行后面是列
同
print(np.array[a[0,0],a[1,1],a[2,0]]) #[1,4,5]
print(a[[0,0],[1,1]]) #[2,2]
同
print(np.array[a[0,1],a[0,1]]) #[2,2]
#整数索引使用,选择修改矩阵中某些行中的某些值
a=np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])
print(a) #[[1,2,3],
# [4,5,6],
# [7,8,9],
# [10,11,12]]
b = np.array([0, 2, 0, 1]) #创建一个下标数组
print(a[np.arrange(4),b]) #使用b中元素做下标取a中每行对应的元素
#[1,6,7,11]
a[np.arrange(4),b]+10 #改变对应的值
print(a) #[[11,2,3],
# [4,5,16],
# [17,8,9],
# [10,21,12]]
#布尔索引,从数组中取出一些满足一定条件的元素
a = np.array([[1,2], [3, 4], [5, 6]]) #[[1,2],[3,4],[5,6]]
bool_idx=(a>2) #找出a中大于2的元素,
#返回值为形如a的矩阵,值为False或True
print(bool_idx) #[[False,False],[True,True],[True,True]]
#使用布尔数组做下标输出a中的值
print(a[bool_idx]) #[3,4,5,6]
###########################Numpy数组中的数据类型##############################
#缺省情况下,numpy 自动选择
x = np.array([1, 2])
print(x.dtype) #int64
x = np.array([1.0, 2.0])
print(x.dtype)]) #float64
#强制类型转换
x = np.array([1, 2], dtype=np.float64)
print(x.dtype) #float64
#################################数组数学运算#################################
###按元素操作的基本数学运算,可以使用运算符,也可以使用相关函数
x = np.array([[1,2],[3,4]], dtype=np.float64)
y = np.array([[5,6],[7,8]], dtype=np.float64)
#加法
print(x + y)
print(np.add(x, y)) #[[6.0,8.0],[10.0,12.0]]
#减法
print(x - y)
print(np.subtract(x, y)) #[[-4.0,-4.0],[-4.0,-4.0]]
#按位除
print(x / y)
print(np.divide(x, y)) #[[0.2,0.33333333],[0.42851743,0.5]]
#按位乘
print(x * y)
print(np.multiply(x, y)) #[[5.0,12.0],[21.0,32.0]]
#按位取平方根
print(np.sqrt(x)) #[[1.,1.41421356],[]1.73205081,2.]
###矩阵运算
x = np.array([[1,2],[3,4]])
y = np.array([[5,6],[7,8]])
v = np.array([9,10])
w = np.array([11, 12])
#向量内积
print(v.dot(w))
print(np.dot(v, w)) #219
#矩阵向量相乘
print(x.dot(v))
print(np.dot(x, v)) #[29,67]
#矩阵相乘
print(x.dot(y))
print(np.dot(x, y)) #[[19,22],[43,50]]
###数组中最有用的函数之一sum
x = np.array([[1,2],[3,4]])
print(np.sum(x)) #10,计算数组x中所有元素的和
print(np.sum(x, axis=0)) #[4 6],按列求和
print(np.sum(x, axis=1)) #[3 7],按行求和
###数组reshape或元素操作
#转置
x = np.array([[1,2], [3,4]])
print(x) #[[1,2],[3,4]]
print(x.T) #[[1,3],[2,4]]
#对向量转置不起作用
v = np.array([1,2,3])
print(v) #[1,2,3]
print(v.T) #[1,2,3]
########################## Broadcasting #####################################
#Broadcast是numpy中不同shape的数组进行数学运算的有效机制
#例:假如对一个矩阵的每一行同一个向量相加
#1.常规做法
x = np.array([[1,2,3], [4,5,6], [7,8,9], [10, 11, 12]])
v = np.array([1, 0, 1])
y = np.empty_like(x) #创建一个形如x的空数组
for i in range(4):
y[i, :] = x[i, :] + v
print(y) #[[2,2,4],
# [5,5,7],
# [8,8,10],
# [11,11,13]]
#but,若x很大,显示的循环在py中很费时
#2.使用v生成一个与x shape相同的矩阵
x = np.array([[1,2,3], [4,5,6], [7,8,9], [10, 11, 12]])
v = np.array([1, 0, 1])
vv = np.tile(v, (4, 1)) #在每层上堆积v,(4,3)
y = x + vv
print(y) #[[2,2,4],
# [5,5,7],
# [8,8,10],
# [11,11,13]]
#3使用broadcast
x = np.array([[1,2,3], [4,5,6], [7,8,9], [10, 11, 12]])
v = np.array([1, 0, 1])
y = x + v #不同shape的数组相加
print(y) #[[2,2,4],
# [5,5,7],
# [8,8,10],
# [11,11,13]]
numpy.flatnonzero(a)
返回将a
flatten之后的一维数组中非零元素的下标(indices)
>>>a=np.array([[1,2],[0,-1]])
>>>b=np.flatnonzero(a)
>>>b
array([0,1,3])
numpy.vstack(a,b)
,沿垂直方向合并数组(行方向),a,b除第一维外,其他维数要相同
>>> a = np.array([1, 2, 3])
>>> b = np.array([2, 3, 4])
>>> np.vstack((a,b))
array([[1, 2, 3],
[2, 3, 4]])
>>> a = np.array([[1], [2], [3]])
>>> b = np.array([[2], [3], [4]])
>>> np.vstack((a,b))
# a.shape为3x1
array([[1],
[2],
[3],
[2],
[3],
[4]])
numpy.stack(arr,axis=1)
,沿当前轴方向合并数组
>>> arrays = [np.random.randn(1, 2) for _ in range(3)]
>>> arrays
[array([[0.66415129, 1.17639802]]),
array([[-0.20116847, -0.07704193]]),
array([[0.82340426, 0.56482453]])]
>>> np.stack(arrays,axis=-1)
array([[[ 0.66415129, -0.20116847, 0.82340426],
[ 1.17639802, -0.07704193, 0.56482453]]])
In [16]: np.stack(arrays,axis=0)
Out[16]:
array([[[ 0.66415129, 1.17639802]],
[[-0.20116847, -0.07704193]],
[[ 0.82340426, 0.56482453]]])
- reference
[1]https://docs.scipy.org/doc/numpy/user/basics.creation.html#arrays-creation
[2]https://docs.scipy.org/doc/numpy/reference/arrays.indexing.html
[3]https://docs.scipy.org/doc/numpy/reference/arrays.dtypes.html
[4]https://docs.scipy.org/doc/numpy/reference/routines.math.html
[5]https://docs.scipy.org/doc/numpy/reference/ufuncs.html#available-ufuncs
[6]http://scipy.github.io/old-wiki/pages/EricsBroadcastingDoc
[7]http://cs231n.github.io/python-numpy-tutorial/#numpy-datatypes