Numpy语法入门(一)

1 Numpy简易入门

1.1 认识Numpy数组对象

1.1.1 np.arange

In [1]:

import numpy as np
#创建3行4列的数组
data = np.arange(12).reshape(3,4)
data

Out[1]:

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

In [2]:

#arange
np.arange(1, 20, 5)#[1,20)间隔5

Out[2]:

array([ 1,  6, 11, 16])

1.1.2 类型

In [3]:

type(data)

Out[3]:

numpy.ndarray

1.1.3 数组维度个数

In [4]:

data.ndim

Out[4]:

2

1.1.4 数组的维度

In [5]:

data.shape

Out[5]:

(3, 4)

1.1.5 数组元素的个数

In [6]:

data.size

Out[6]:

12

1.1.6 数据元素的类型

In [7]:

data.dtype

Out[7]:

dtype('int32')

1.2 创建Numpy数组

1.2.1 创建数组

In [8]:

#创建一维数组
data1 = np.array([1,2,3])
data1

Out[8]:

array([1, 2, 3])

In [9]:

#创建二维数组
data2 = np.array([[1,2,3],[4,5,6]])
data2

Out[9]:

array([[1, 2, 3],
       [4, 5, 6]])

1.2.2 特殊数组

In [10]:

#全0数组
np.zeros((3,4))

Out[10]:

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

In [11]:

#全1数组
np.ones((3,4))

Out[11]:

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

In [12]:

#全空数组 每个数字接近0
np.empty((3,4))

Out[12]:

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

In [13]:

#浮点数数组
np.ones((2,3), float)

Out[13]:

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

1.3 ndarry对象的数据类型

1.3.1 查看数据类型

In [14]:

data_one = np.array([[1,2,3],[4,5,6]])
data_one.dtype.name

Out[14]:

'int32'

1.3.2 转换数据类型

In [15]:

data = np.array([[1,2,3],[4,5,6]])
data.dtype

Out[15]:

dtype('int32')

In [16]:

float_data = data.astype(np.float64)
float_data.dtype

Out[16]:

dtype('float64')

In [17]:

float_data = np.array([1.2,2.3,3.5])
float_data

Out[17]:

array([1.2, 2.3, 3.5])

In [18]:

int_data = float_data.astype(np.int64)
int_data

Out[18]:

array([1, 2, 3], dtype=int64)

In [19]:

str_data = np.array(['1','2','3'])
int_data = str_data.astype(np.int64)
int_data

Out[19]:

array([1, 2, 3], dtype=int64)

1.4 数组运算

1.4.1 向量化运算

In [20]:

data1 = np.array([[1,2,3],[4,5,6]])
data2 = np.array([[1,2,3],[4,5,6]])
data1 + data2

Out[20]:

array([[ 2,  4,  6],
       [ 8, 10, 12]])

In [21]:

data1 * data2

Out[21]:

array([[ 1,  4,  9],
       [16, 25, 36]])

In [22]:

data1 - data2

Out[22]:

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

In [23]:

data1 / data2

Out[23]:

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

1.4.2 数组广播

numpy数组的基础运算要求一对一,即a.shape==b.shape

如果两者不相同,自动触发广播机制

广播机制

In [24]:

arr1 = np.array([[0], [10], [20], [30]])
arr1.shape

Out[24]:

(4, 1)

In [25]:

arr2 = np.array([0, 1, 2])
arr2.shape

Out[25]:

(3,)

In [26]:

arr1 + arr2

Out[26]:

array([[ 0,  1,  2],
       [10, 11, 12],
       [20, 21, 22],
       [30, 31, 32]])
广播机制

1.4.3 数组与标量的运算

In [27]:

data1 = np.array([[1,2,3],[4,5,6]])
data2 = 10

In [28]:

data1+data2

Out[28]:

array([[11, 12, 13],
       [14, 15, 16]])

In [29]:

data1 * data2

Out[29]:

array([[10, 20, 30],
       [40, 50, 60]])

In [30]:

data1 - data2

Out[30]:

array([[-9, -8, -7],
       [-6, -5, -4]])

In [31]:

data1 / data2

Out[31]:

array([[0.1, 0.2, 0.3],
       [0.4, 0.5, 0.6]])

1.5 ndarray的索引和切片

索引和切片

In [32]:

arr = np.arange(8)
arr

Out[32]:

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

In [33]:

arr[5]

Out[33]:

5

In [34]:

arr[3:5]

Out[34]:

array([3, 4])

In [35]:

arr[1:6:2]

Out[35]:

array([1, 3, 5])

In [36]:

arr2d = np.arange(1,10).reshape(3,3)
arr2d

Out[36]:

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

In [37]:

arr2d[1]

Out[37]:

array([4, 5, 6])

In [38]:

arr2d[:2]

Out[38]:

array([[1, 2, 3],
       [4, 5, 6]])

In [39]:

arr2d[0:2, 0:2]

Out[39]:

array([[1, 2],
       [4, 5]])

In [40]:

arr2d[1, :2]

Out[40]:

array([4, 5])

1.5.2 花式索引

In [41]:

demo_arr = np.empty((4,4))
for i in range(4):
    demo_arr[i] = np.arange(i, i + 4)
demo_arr

Out[41]:

array([[0., 1., 2., 3.],
       [1., 2., 3., 4.],
       [2., 3., 4., 5.],
       [3., 4., 5., 6.]])

In [42]:

#获取第0行,第2行
demo_arr[[0, 2]]

Out[42]:

array([[0., 1., 2., 3.],
       [2., 3., 4., 5.]])

In [43]:

#获取元素(1,1) (3,2)
demo_arr[[1,3], [1,2]]

Out[43]:

array([2., 5.])

1.5.3 布尔型

In [44]:

student_name = np.array(["Tom", "Lily", "Jack", "Rose"])
student_score = np.array([[79, 88, 80],[89, 90, 92],[83, 78, 85],[78,76,80]])

In [45]:

#进行==判断,生成布尔型数组
student_name == 'Jack'

Out[45]:

array([False, False,  True, False])

In [46]:

#返回数据是True对应的行
student_score[student_name == 'Jack']

Out[46]:

array([[83, 78, 85]])

In [47]:

student_score[student_name == 'Jack', :1]

Out[47]:

array([[83]])

1.6 数组的转置与轴对称

In [48]:

arr = np.arange(12).reshape((3,4))
arr

Out[48]:

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

In [49]:

#使用T属性进行转置
arr.T

Out[49]:

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

In [50]:

#使用transpose函数进行转置
#默认维度是行和列,用0,1表示,传入参数1,0表示交换行和列
arr.transpose(1,0)

Out[50]:

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

In [51]:

arr_3d = np.arange(16).reshape((2,2,4))
arr_3d

Out[51]:

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

       [[ 8,  9, 10, 11],
        [12, 13, 14, 15]]])

In [52]:

#使用transpose函数进行转置
#默认维度是0,1,2表示,现在变成1,2,0 对应维度进行变换 变成2*4*2
arr_3d.transpose(1,2,0)

Out[52]:

array([[[ 0,  8],
        [ 1,  9],
        [ 2, 10],
        [ 3, 11]],

       [[ 4, 12],
        [ 5, 13],
        [ 6, 14],
        [ 7, 15]]])

In [53]:

#利用swapaxes函数 参数x,y 交换维度x,y
arr_3d.swapaxes(1,0)

Out[53]:

array([[[ 0,  1,  2,  3],
        [ 8,  9, 10, 11]],

       [[ 4,  5,  6,  7],
        [12, 13, 14, 15]]])

1.7 NumPy通用函数

In [54]:

arr = np.array([4,9,16])

In [55]:

#开方
np.sqrt(arr)

Out[55]:

array([2., 3., 4.])

In [56]:

#绝对值
np.abs(arr)

Out[56]:

array([ 4,  9, 16])

In [57]:

#平方
np.square(arr)

Out[57]:

array([ 16,  81, 256], dtype=int32)

In [58]:

#数组相加
x = np.array([1,5,4,6])
y = np.array([2,7,3,8])
np.add(x, y)

Out[58]:

array([ 3, 12,  7, 14])

In [59]:

#数组相减
np.subtract(x,y)

Out[59]:

array([-1, -2,  1, -2])

In [60]:

#数组相乘
np.multiply(x,y)

Out[60]:

array([ 2, 35, 12, 48])

In [61]:

#数组相除
np.divide(x,y)

Out[61]:

array([0.5       , 0.71428571, 1.33333333, 0.75      ])

In [62]:

#取最大值
np.maximum(x,y)

Out[62]:

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

In [63]:

np.greater(x,y)

Out[63]:

array([False, False,  True, False])

1.8 利用NumPy数组进行数据处理

1.8.1 将条件逻辑转为数组运算

In [64]:

#np.where(bool, x, y) 为true则选择x,否则选择y
arr_x = np.array([1,5,7])
arr_y = np.array([2,6,8])
arr_con = np.array([True, False, True])
result = np.where(arr_con, arr_x, arr_y)
result

Out[64]:

array([1, 6, 7])

In [65]:

x = np.array([[1,0],[2,-2],[-2,1]])
np.where(x>0,x,0)

Out[65]:

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

In [66]:

np.where(x>0)#返回满足条件的索引,这里是二维数组所以索引是两个维度

Out[66]:

(array([0, 1, 2], dtype=int64), array([0, 0, 1], dtype=int64))

In [67]:

#x,y不存在时,返回为True的索引
np.where(arr_x > 3)

Out[67]:

(array([1, 2], dtype=int64),)

1.8.2 数组统计运算

In [68]:

arr = np.arange(10)

In [69]:

#求和
arr.sum()

Out[69]:

45

In [70]:

#平均值
arr.mean()

Out[70]:

4.5

In [71]:

#最大值
arr.max()

Out[71]:

9

In [72]:

#最小值
arr.min()

Out[72]:

0

In [73]:

#最大值索引
arr.argmax()

Out[73]:

9

In [74]:

#最小值索引
arr.argmin()

Out[74]:

0

In [75]:

#前缀和
arr.cumsum()

Out[75]:

array([ 0,  1,  3,  6, 10, 15, 21, 28, 36, 45], dtype=int32)

In [76]:

#前缀积
arr.cumprod()

Out[76]:

array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0], dtype=int32)

In [77]:

arr = np.arange(12).reshape((3,4))
arr

Out[77]:

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

In [78]:

arr.sum(axis = 0)
#axis=0 表示除第0维度外,其他维度相同的进行相加
#即a[0][0]+a[1][0]+a[2][0]=12
#即一列相加

Out[78]:

array([12, 15, 18, 21])

In [79]:

arr.sum(axis = 1)
#axis=0 表示除第1维度外,其他维度相同的进行相加
#即a[0][0]+a[0][1]+a[0][2]+a[0][3] = 6
#即一列相加

Out[79]:

array([ 6, 22, 38])

In [80]:

np.diff(arr, axis = 1)
#差分

Out[80]:

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

In [81]:

np.diff(arr, axis = 0)
#差分

Out[81]:

array([[4, 4, 4, 4],
       [4, 4, 4, 4]])

In [82]:

np.floor([-0.6, -1.4, -0.1, -1.8, 0, 1.4, 1.7])
#向下取整

Out[82]:

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

In [83]:

np.ceil([-0.6, -1.4, -0.1, -1.8, 0, 1.4, 1.7])
#向上取整

Out[83]:

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

1.8.3 数组排序

In [84]:

arr = np.array([[6,2,7], [3,6,2], [4,3,2]])
print(arr)
arr.sort()#默认:axis = 1 每一行排列
arr

Out[84]:

[[6 2 7]
 [3 6 2]
 [4 3 2]]
array([[2, 6, 7],
       [2, 3, 6],
       [2, 3, 4]])

In [85]:

arr = np.array([[6,2,7], [3,6,2], [4,3,2]])
print(arr)
arr.sort(axis = 0)
arr

Out[85]:

[[6 2 7]
 [3 6 2]
 [4 3 2]]
array([[3, 2, 2],
       [4, 3, 2],
       [6, 6, 7]])

1.8.4 检查数组元素

In [86]:

arr = np.array([[1,-2,-7], [-3,6,2], [-4,3,2]])
arr

Out[86]:

array([[ 1, -2, -7],
       [-3,  6,  2],
       [-4,  3,  2]])

In [87]:

#arr所有中,是否有一个大于0
np.any(arr>0)

Out[87]:

True

In [88]:

#arr所有元素是否都大于0
np.all(arr>0)

Out[88]:

False

1.8.5 唯一化及其他集合逻辑

In [89]:

arr = np.array([12,11,34,23,12,8,11])
#去重排序
np.unique(arr)

Out[89]:

array([ 8, 11, 12, 23, 34])

In [90]:

#检查ndarray中的元素是否等于[11,12]中的一个,返回bool数组
np.in1d(arr, [11,12])

Out[90]:

array([ True,  True, False, False,  True, False,  True])

1.9 线性代数模块

In [91]:

arr_x = np.array([[1,2,3],[4,5,6]])
arr_y = np.array([[1,2],[3,4],[5,6]])
#矩阵乘法
np.dot(arr_x, arr_y)

Out[91]:

array([[22, 28],
       [49, 64]])

In [92]:

arr_x = np.array([1,2,3])
arr_y = np.array([4,5,6])
#相邻内积
np.dot(arr_x, arr_y)

Out[92]:

32

1.10 随机数模块

In [93]:

#生成3*3二维数组 随机数满足标准正态分布
np.random.rand(3,3)

Out[93]:

array([[0.84605074, 0.82890355, 0.87727491],
       [0.15867545, 0.59406993, 0.32397337],
       [0.32959366, 0.44147691, 0.08369832]])

In [94]:

#生成2*3*3三维数组
np.random.rand(2,3,3)

Out[94]:

array([[[0.60817751, 0.38764354, 0.7409757 ],
        [0.04089362, 0.24936102, 0.97661135],
        [0.25285954, 0.04942331, 0.97362796]],

       [[0.15259705, 0.97900768, 0.90175511],
        [0.17868536, 0.50850353, 0.34824289],
        [0.73240194, 0.96398491, 0.22104247]]])

In [95]:

#随机数种子 zhongz
np.random.seed(0)

In [96]:

np.random.rand(5)

Out[96]:

array([0.5488135 , 0.71518937, 0.60276338, 0.54488318, 0.4236548 ])

In [97]:

#种子相同 数字相同
np.random.seed(0)
np.random.rand(5)

Out[97]:

array([0.5488135 , 0.71518937, 0.60276338, 0.54488318, 0.4236548 ])
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342