查看原文
其他

入门numpy(50%-65%)【解读numpy官方文档】

2017-07-10 王大伟 Python爱好者社区

(点击上方Python爱好者社区,可快速关注)

作者:王大伟

博客专栏:https://www.hellobi.com/u/wangdawei/articles

Python爱好者社区  唯一小编 

前言

这几天很忙啊,所以也没时间静下心来写文章,现在好点了,我们继续numpy官网之旅

import numpy as np

形状操作

改变数组的形状

a = np.floor(10*np.random.random((3,4)))
a


a.resize((2,6))
a


注:改变a数组形状


如果在改变形状操作中将尺寸给定为-1,则会自动计算其尺寸:

a.reshape(3,-1)


查看这部分更多更详细的用法可以看:https://docs.scipy.org/doc/numpy-dev/user/quickstart.html

下图部分:



堆叠不同的数组

几个数组可以沿不同的轴堆叠在一起:

a = np.floor(10*np.random.random((2,2)))
a


b = np.floor(10*np.random.random((2,2)))
b


np.vstack((a,b))


注:这里v是vertical的缩写,意思是垂直方向,所以这里是按照竖直方向堆叠数组

np.hstack((a,b))


注:这里的h是horizontal的缩写,是水平方向,所以这里是指的水平方向堆叠数组


函数column_stack将1维数组作为列堆叠成2维数组。 

from numpy import newaxis
np.column_stack((a,b))  


注:水平方向堆叠成二维数组


a = np.array([4.,2.])
b = np.array([2.,8.])
a[:,newaxis]  


注:切片出二维数组


np.column_stack((a[:,newaxis],b[:,newaxis]))


注:将两个切片的二维数组组成新的二维数组


np.vstack((a[:,newaxis],b[:,newaxis]))


注:竖直方向堆叠出新的二维数组


注意:在复杂情况下,r_和c_对于通过沿一个轴堆叠数字来创建数组很有用。 它们允许使用范围文字(“:”)

np.r_[1:4,0,4]


注:1—3,0,4组成数组


当使用数组作为参数时,r_和c_在其默认行为中类似于vstack和hstack,但允许使用可选参数来指定要连接的轴数。

查看这部分更多更详细的用法可以看:https://docs.scipy.org/doc/numpy-dev/user/quickstart.html

下图部分:



将一个数组分成几个较小的数组

使用hsplit,可以沿着水平轴拆分数组,方法是指定要返回的等同形状数组的数量,或者指定之后应该进行拆分的列

a = np.floor(10*np.random.random((2,12)))
a



np.hsplit(a,3)


注:将a数组水平方向切分成相等的3份


np.hsplit(a,(3,4))


注:从第三个和第四个后面分别切一刀,水平分成3块新数组


np.hsplit(a,(3,))  


注:从第三个后面切一刀,水平分成2块新数组


vsplit沿垂直轴分割,而array_split允许用来指定要分割的轴:

np.vsplit(a,(1,))  


注:从第一行后面切一刀,垂直分成2块新数组


复制和视图

当操作数组时,它们的数据有时被复制到一个新的数组中,有时候不会。 这往往是初学者混乱的根源。 有三种情况:

没有复制的情况

简单的赋值不会使数组对象或其数据被复制

a = np.arange(12)
b = a          
b is a      


注:这里a和b指向的是同一个数组,操作时并没有产生新的复制内容


b.shape = 3,4
a.shape


注:这里改变b数组的形状,a的也发生了变化,说明这里a和b指向的是同一个数组


Python将可变对象作为引用传递,因此函数调用不会复制一份新的

def f(x):
    print(id(x))  
       
id(a)


f(a)


注:这里函数返回的结果id是相同的,所以函数调用不会复制一份新的内容(id是对象的唯一标识)


视图或浅拷贝

不同的数组对象可以共享相同的数据。 视图方法创建一个包含相同数据的新数组对象

c = a.view()
c is a


注:通过view方法生成的c已经和a不是同一个了


c.base is a


注:c是基于a的


c.flags.owndata


注:c拥有数据?:并没有(因为c是拷贝了a的)


a.flags.owndata


注:a拥有数据


c.shape = 2,6


注:c的形状(3行4列)


c[0,4] = 1234
a


注:在c中修改会传到a中,因为数据实际保存在a中


切换数组返回其视图:

s = a[ : , 1:3]    
s[:] = 10          
a


注:s[:]是s的视图。注意s=10 和 s[:]=10的不同


深层复制

深层复制方法将完整复制数组及其数据

d = a.copy()                        
d is a


注:创建了新的数组和新的数据


d.base is a


注:d没有和a共享任何数据


d[0,0] = 9999
a


注:d内容修改不会影响a


函数和方法概述

这里列出了一些有用的NumPy函数和方法, 有关完整列表,请参阅例程:

https://docs.scipy.org/doc/numpy-dev/reference/routines.html#routines


今天更新内容比较少,昨晚没睡好,精神不佳,学校太热了。

未完待续~近期更新~谢谢观赏~希望对你学习有帮助~

关注公众号,“Python爱好者社区”,回复“爬虫”即可获取崔老师爬虫免费学习视频。


Python爱好者社区


为大家提供与Python相关的最新技术和资讯。

长按指纹 > 识别图中二维码 > 添加关注

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存