CS231n-Numpy入门

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)
    返回将aflatten之后的一维数组中非零元素的下标(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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值