[一] Numpy入门

[一] Numpy入门


In [2]:

import numpy as np

传统计算方法与numpy比较

In [4]:

def pySum():
    a = [0, 1, 2, 3, 4]
    b = [5, 6, 7, 8, 9]
    c = []
    
    for i in range(len(a)):
        c.append(a[i]**2 + b[i]**3)
    
    return c

pySum()

Out[4]:

[125, 217, 347, 521, 745]

In [7]:

def npSum():
    a = np.array([0, 1, 2, 3, 4])
    b = np.array([5, 6, 7, 8, 9])
    
    c = a**2 + b**3
    
    return c

npSum()

Out[7]:

array([125, 217, 347, 521, 745], dtype=int32)

ndarray数组的属性

In [8]:

a = np.array([[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]])

print("ndim:    {}".format(a.ndim))
print("shape:   {}".format(a.shape))
print("size:    {}".format(a.size))
print("dtype:   {}".format(a.dtype))
print("itemsize:{}".format(a.itemsize))

Out [8]:

ndim:    2
shape:   (2, 5)
size:    10
dtype:   int32
itemsize:4

ndarray数组的创建

In [10]:

# x = np.array(list/array, dtype=np.uint8)

In [11]:

x = np.array([0, 1, 2, 3])
print(x)

Out[11]:

[0 1 2 3]
使用numpy中函数创建ndarray数组

In [28]:

np.arange(10)

Out[28]:

array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

In [29]:

np.ones((3, 6))

Out[29]:

array([[1., 1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1., 1.]])

In [30]:

np.zeros((5, 5))

Out[30]:

array([[0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.]])

In [31]:

np.full((3, 3), 8)

Out[31]:

array([[8, 8, 8],
       [8, 8, 8],
       [8, 8, 8]])

In [32]:

np.eye(5)

Out[32]:

array([[1., 0., 0., 0., 0.],
       [0., 1., 0., 0., 0.],
       [0., 0., 1., 0., 0.],
       [0., 0., 0., 1., 0.],
       [0., 0., 0., 0., 1.]])

In [33]:

a = np.full((3, 3), 8)

In [21]:

np.zeros_like(a)

Out[21]:

array([[0, 0, 0],
       [0, 0, 0],
       [0, 0, 0]])

In [34]:

np.ones_like(a)

Out[34]:

array([[1, 1, 1],
       [1, 1, 1],
       [1, 1, 1]])

In [38]:

np.full_like(a.reshape(1, -1), 7)

Out[38]:

array([[7, 7, 7, 7, 7, 7, 7, 7, 7]])

In [39]:

a = np.linspace(1, 10, 4)
a

Out[39]:

array([ 1.,  4.,  7., 10.])

In [41]:

b = np.linspace(1, 10, 4, endpoint=False)
b

Out[41]:

array([1.  , 3.25, 5.5 , 7.75])

In [43]:

c = np.concatenate((a, b))
c

Out[43]:

array([ 1.  ,  4.  ,  7.  , 10.  ,  1.  ,  3.25,  5.5 ,  7.75])

ndarray数组的变换

In [60]:

a = np.ones((2, 3, 4), dtype=np.int32)
a.reshape((3, 8))

Out[60]:

array([[1, 1, 1, 1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1, 1, 1, 1]])

In [61]:

# 可以看出,reshape并不会改变原数组
a

Out[61]:

array([[[1, 1, 1, 1],
        [1, 1, 1, 1],
        [1, 1, 1, 1]],

       [[1, 1, 1, 1],
        [1, 1, 1, 1],
        [1, 1, 1, 1]]])

In [62]:

c = np.ones((2, 3, 4), dtype=np.int32)
c.resize((3, 8))

In [63]:

# resize改变了原数组
c

Out[63]:

array([[1, 1, 1, 1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1, 1, 1, 1]])

In [64]:

a.flatten()

Out[64]:

array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1])

In [65]:

# flatten不改变原数组
a

Out[65]:

array([[[1, 1, 1, 1],
        [1, 1, 1, 1],
        [1, 1, 1, 1]],

       [[1, 1, 1, 1],
        [1, 1, 1, 1],
        [1, 1, 1, 1]]])
使用astype改变ndarray的类型

In [67]:

a = np.ones((2, 3, 4), dtype=np.int32)
a

Out[67]:

array([[[1, 1, 1, 1],
        [1, 1, 1, 1],
        [1, 1, 1, 1]],

       [[1, 1, 1, 1],
        [1, 1, 1, 1],
        [1, 1, 1, 1]]])

In [68]:

b = a.astype(np.float32)
b

Out[68]:

array([[[1., 1., 1., 1.],
        [1., 1., 1., 1.],
        [1., 1., 1., 1.]],

       [[1., 1., 1., 1.],
        [1., 1., 1., 1.],
        [1., 1., 1., 1.]]], dtype=float32)
ndarray数组向列表进行转换(tolist)

In [69]:

a = np.full((2, 3, 4), 22, dtype=np.int32)
a

Out[69]:

array([[[22, 22, 22, 22],
        [22, 22, 22, 22],
        [22, 22, 22, 22]],

       [[22, 22, 22, 22],
        [22, 22, 22, 22],
        [22, 22, 22, 22]]])

In [70]:

a.tolist()

Out[70]:

[[[22, 22, 22, 22], [22, 22, 22, 22], [22, 22, 22, 22]],
 [[22, 22, 22, 22], [22, 22, 22, 22], [22, 22, 22, 22]]]

ndarray数组的索引与切片

  • 索引:获取数组中特定位置元素的过程
  • 切片:获取数组元素子集的过程
一维数组的索引和切片 : 与Python列表类似

In [3]:

a = np.array([9, 8, 7, 6, 5])
a[2]

Out[3]:

7

In [4]:

a[1:4:2]

Out[4]:

array([8, 6])
多维数组的索引
  • 每一个维度的索引用逗号分隔

In [5]:

a = np.arange(24).reshape((2, 3, 4))
a

Out[5]:

array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],

       [[12, 13, 14, 15],
        [16, 17, 18, 19],
        [20, 21, 22, 23]]])

In [6]:

a[1, 2, 3]

Out[6]:

23

In [7]:

a[0, 1, 2]

Out[7]:

6

In [8]:

a[-1, -2, -3]

Out[8]:

17
多维数组的切片
  • 单个冒号表示包括整个维度

In [13]:

a = np.arange(24).reshape((2, 3, 4))
a

Out[13]:

array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],

       [[12, 13, 14, 15],
        [16, 17, 18, 19],
        [20, 21, 22, 23]]])

In [12]:

a[:, 1, -3]

Out[12]:

array([ 5, 17])

In [14]:

a[:, 1:3, :]

Out[14]:

array([[[ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],

       [[16, 17, 18, 19],
        [20, 21, 22, 23]]])

In [16]:

# 多个冒号表示[start:end:stripe],此处start和end为默认值,stripe=2
a[:, :, ::2]

Out[16]:

array([[[ 0,  2],
        [ 4,  6],
        [ 8, 10]],

       [[12, 14],
        [16, 18],
        [20, 22]]])

ndarray数组的运算

数组与标量之间的运算
  • 数组中的每一个元素都与标量进行运算

In [21]:

a = np.arange(24).reshape((2, 3, 4))
a

Out[21]:

array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],

       [[12, 13, 14, 15],
        [16, 17, 18, 19],
        [20, 21, 22, 23]]])

In [22]:

a.mean()

Out[22]:

11.5

In [23]:

a = a / a.mean()
a

Out[23]:

array([[[0.        , 0.08695652, 0.17391304, 0.26086957],
        [0.34782609, 0.43478261, 0.52173913, 0.60869565],
        [0.69565217, 0.7826087 , 0.86956522, 0.95652174]],

       [[1.04347826, 1.13043478, 1.2173913 , 1.30434783],
        [1.39130435, 1.47826087, 1.56521739, 1.65217391],
        [1.73913043, 1.82608696, 1.91304348, 2.        ]]])
常用的Numpy二元函数
  • np.maximum(x, y, …)或np.fmax(x, y, …) : 多个数组相应位置的最大值计算
  • np.minimum(x, y, …)或np.fmin(x, y, …) : 多个数组相应位置的最小值计算
  • np.multuply(x, y)或 * : 两个数组相应位置相乘(不是矩阵相乘)
  • np.dot(x, y) : 矩阵相乘

In [24]:

a = np.array([[5, 7, 4], [2, 7, 9], [2, 4, 3]])
a

Out[24]:

array([[5, 7, 4],
       [2, 7, 9],
       [2, 4, 3]])

In [25]:

b = np.array([[8, 4, 1], [6, 8, 9], [2, 6, 4]])
b

Out[25]:

array([[8, 4, 1],
       [6, 8, 9],
       [2, 6, 4]])

In [39]:

np.maximum(a, b)

Out[39]:

array([[8, 7, 4],
       [6, 8, 9],
       [2, 6, 4]])

In [35]:

np.fmax(a, b, np.zeros((3, 3)))

Out[35]:

array([[8, 7, 4],
       [6, 8, 9],
       [2, 6, 4]])

In [37]:

np.minimum(a, b)

Out[37]:

array([[5, 4, 1],
       [2, 7, 9],
       [2, 4, 3]])

In [38]:

np.fmin(a, b)

Out[38]:

array([[5, 4, 1],
       [2, 7, 9],
       [2, 4, 3]])

In [42]:

np.multiply(a, b)

Out[42]:

array([[40, 28,  4],
       [12, 56, 81],
       [ 4, 24, 12]])

In [43]:

a * b

Out[43]:

array([[40, 28,  4],
       [12, 56, 81],
       [ 4, 24, 12]])

In [44]:

np.dot(a, b)

Out[44]:

array([[ 90, 100,  84],
       [ 76, 118, 101],
       [ 46,  58,  50]])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值