numpy——基础数组与计算

In [1]:
import  numpy as np
In [11]:
# 创建数组
a = np.array([1,2,3,4,5])
In [12]:
a
Out[12]:
array([1, 2, 3, 4, 5])
In [9]:
np.array(range(1,6))
Out[9]:
array([1, 2, 3, 4, 5])
In [10]:
np.arange(1,6)
Out[10]:
array([1, 2, 3, 4, 5])
In [13]:
# 数组的类名
type(a)
Out[13]:
numpy.ndarray
In [14]:
# 数据的类型
a.dtype
Out[14]:
dtype('int32')
In [15]:
t1 = np.arange(12)
In [16]:
t1
Out[16]:
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])
In [17]:
t1.shape
Out[17]:
(12,)
In [18]:
t2 = np.array([[1,2,3], [2,3,4]])
In [19]:
t2
Out[19]:
array([[1, 2, 3],
       [2, 3, 4]])
In [20]:
# 数据的形状
t2.shape
Out[20]:
(2, 3)
In [21]:
t3 = np.array([[[1,2,3], [4,5,6]], [[7,8,9], [10,11,12]]])
In [22]:
t3.shape
Out[22]:
(2, 2, 3)
In [23]:
t3
Out[23]:
array([[[ 1,  2,  3],
        [ 4,  5,  6]],

       [[ 7,  8,  9],
        [10, 11, 12]]])
In [24]:
t4 = np.arange(12)
In [25]:
# 3行4列
t4.reshape((3, 4))
Out[25]:
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
In [26]:
t4.reshape((3, 5))
 
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-26-a0fbe961a05c> in <module>
----> 1t4.reshape((3, 5))

ValueError: cannot reshape array of size 12 into shape (3,5)
In [8]:
t5 = np.arange(24)
In [9]:
# 2块2行6列
t5.reshape(2, 2, 6)
Out[9]:
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 [10]:
# 2块3行4列
t5.reshape(2, 3, 4)
Out[10]:
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 [11]:
t5
Out[11]:
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])
 

可以看出,reshape方法,没有改变t5的原始值,说明方法本身就存在return方法

In [31]:
# 需要改变的话
t5 = t5.reshape((4, 6))
 

如果t5为None的话,就说明某方法会直接改变原始值,不存在return方法

In [32]:
t5
Out[32]:
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 [2]:
a = np.array([1,0,1,0],dtype=np.bool) # 或者使用dtype='?'

 


In [3]:
a
Out[3]:
array([ True, False,  True, False])
In [4]:
# 修改数组的数据类型
a.astype('i1') # 或者使用a.astype(np.int8)
Out[4]:
array([1, 0, 1, 0], dtype=int8)
In [5]:
# 修改浮点型的小数位数
b = np.array([0.03214, 0.4243564, 0.42566453, 0.4134234, 0.1235, 0.85763])
In [6]:
np.round(b, 2)
Out[6]:
array([0.03, 0.42, 0.43, 0.41, 0.12, 0.86])
In [12]:
t5
Out[12]:
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 [13]:
t5 = t5.reshape((4, 6))
In [14]:
t5
Out[14]:
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 [15]:
# 将数组转换成一维数组
t5.flatten()
Out[15]:
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 = np.arange(24).reshape(2,2,6)
In [23]:
a
Out[23]:
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 [24]:
# 加法
a + 1
Out[24]:
array([[[ 1,  2,  3,  4,  5,  6],
        [ 7,  8,  9, 10, 11, 12]],

       [[13, 14, 15, 16, 17, 18],
        [19, 20, 21, 22, 23, 24]]])
In [25]:
# 乘法
a * 3
Out[25]:
array([[[ 0,  3,  6,  9, 12, 15],
        [18, 21, 24, 27, 30, 33]],

       [[36, 39, 42, 45, 48, 51],
        [54, 57, 60, 63, 66, 69]]])
 

数组与数组的计算

In [26]:
a = np.arange(12).reshape(2, 6)
In [28]:
b = np.arange(21, 33).reshape(2, 6)
In [29]:
a
Out[29]:
array([[ 0,  1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10, 11]])
In [30]:
b
Out[30]:
array([[21, 22, 23, 24, 25, 26],
       [27, 28, 29, 30, 31, 32]])
 

数组和数组加减法

In [31]:
a + b
Out[31]:
array([[21, 23, 25, 27, 29, 31],
       [33, 35, 37, 39, 41, 43]])
In [32]:
a - b
Out[32]:
array([[-21, -21, -21, -21, -21, -21],
       [-21, -21, -21, -21, -21, -21]])
 

数组和数组的乘除法

In [33]:
a * b
Out[33]:
array([[  0,  22,  46,  72, 100, 130],
       [162, 196, 232, 270, 310, 352]])
In [34]:
a / b
Out[34]:
array([[0.        , 0.04545455, 0.08695652, 0.125     , 0.16      ,
        0.19230769],
       [0.22222222, 0.25      , 0.27586207, 0.3       , 0.32258065,
        0.34375   ]])
In [35]:
np.round(a / b, 2)
Out[35]:
array([[0.  , 0.05, 0.09, 0.12, 0.16, 0.19],
       [0.22, 0.25, 0.28, 0.3 , 0.32, 0.34]])
 

不同维度的数组计算

In [36]:
# 2行6列
a
Out[36]:
array([[ 0,  1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10, 11]])
In [37]:
b = np.array([[1,2,3], [2,3,4]])
In [38]:
# 2行3列
b
Out[38]:
array([[1, 2, 3],
       [2, 3, 4]])
 

维度完全没有关系

In [39]:
a + b
 
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-39-bd58363a63fc> in <module>
----> 1a + b

ValueError: operands could not be broadcast together with shapes (2,6) (2,3) 
In [40]:
a * c
 
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-40-3f6f667472ca> in <module>
----> 1a * c

NameError: name 'c' is not defined
In [41]:
# 2行6列
a
Out[41]:
array([[ 0,  1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10, 11]])
In [42]:
# 1行6列
b = np.array([2,3,4,5,6,7])
In [43]:
a.shape
Out[43]:
(2, 6)
In [44]:
b.shape
Out[44]:
(6,)
 

如果有(从右向左)维度相同的话,操作是可以执行的,按照对应维度广播操作

In [45]:
# 2行6列
a
Out[45]:
array([[ 0,  1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10, 11]])
In [48]:
# 1行6列
b
Out[48]:
array([2, 3, 4, 5, 6, 7])
In [49]:
# 一整行一整行的计算
a + b
Out[49]:
array([[ 2,  4,  6,  8, 10, 12],
       [ 8, 10, 12, 14, 16, 18]])
In [50]:
# 一整行一整行的计算
a * b
Out[50]:
array([[ 0,  3,  8, 15, 24, 35],
       [12, 21, 32, 45, 60, 77]])
In [52]:
c = np.array([[1],[2]])
In [53]:
c
Out[53]:
array([[1],
       [2]])
In [55]:
c.shape
Out[55]:
(2, 1)
In [57]:
a.shape
Out[57]:
(2, 6)
In [59]:
# 2行6列
a
Out[59]:
array([[ 0,  1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10, 11]])
In [60]:
# 2行1列
c
Out[60]:
array([[1],
       [2]])
In [61]:
# 一列一列的计算
a + c
Out[61]:
array([[ 1,  2,  3,  4,  5,  6],
       [ 8,  9, 10, 11, 12, 13]])
In [62]:
# 一列一列的计算
a / c
Out[62]:
array([[0. , 1. , 2. , 3. , 4. , 5. ],
       [3. , 3.5, 4. , 4.5, 5. , 5.5]])
 

广播原则

如果两个数组的后缘维度(trailing dimension,既从末尾开始算起的维度)

的轴长度相符或其中一方的长度为1,则认为他们是广播兼容的。

广播会在缺失和(或)长度为1的维度上进行。

In [75]:
a = np.arange(27).reshape(3,3,3)
In [76]:
b = np.arange(18).reshape(3,3,2)
In [77]:
c = np.arange(6).reshape(3,2)
In [78]:
a.shape
Out[78]:
(3, 3, 3)
In [79]:
b.shape
Out[79]:
(3, 3, 2)
In [80]:
c.shape
Out[80]:
(3, 2)
In [81]:
a + c
 
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-81-e81e582b6fa9> in <module>
----> 1a + c

ValueError: operands could not be broadcast together with shapes (3,3,3) (3,2) 
In [82]:
b + c
Out[82]:
array([[[ 0,  2],
        [ 4,  6],
        [ 8, 10]],

       [[ 6,  8],
        [10, 12],
        [14, 16]],

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

 

posted @ 2019-05-03 20:45  pywjh  阅读(386)  评论(0编辑  收藏  举报
回到顶部