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

浏览: 3065

前言

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

import numpy as np

形状操作

改变数组的形状

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

Clipboard Image.png

a.resize((2,6))
a

Clipboard Image.png

注:改变a数组形状


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

a.reshape(3,-1)

Clipboard Image.png

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

下图部分:

Clipboard Image.png


堆叠不同的数组

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

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

Clipboard Image.png

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

Clipboard Image.png

np.vstack((a,b))

Clipboard Image.png

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

 np.hstack((a,b))

Clipboard Image.png

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


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

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

Clipboard Image.png

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


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

Clipboard Image.png

注:切片出二维数组


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

Clipboard Image.png

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


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

Clipboard Image.png

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


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

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

Clipboard Image.png

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


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

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

下图部分:

Clipboard Image.png


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

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

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

Clipboard Image.png


np.hsplit(a,3)

Clipboard Image.png

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


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

Clipboard Image.png

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


np.hsplit(a,(3,))  

Clipboard Image.png

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


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

np.vsplit(a,(1,))  

Clipboard Image.png

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


复制和视图

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

没有复制的情况

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

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

Clipboard Image.png

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


b.shape = 3,4 
a.shape

Clipboard Image.png

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


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

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

id(a)

Clipboard Image.png

f(a)

Clipboard Image.png

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


视图或浅拷贝

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

c = a.view()
c is a

Clipboard Image.png

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


c.base is a

Clipboard Image.png

注:c是基于a的


c.flags.owndata

Clipboard Image.png

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


a.flags.owndata

Clipboard Image.png

注:a拥有数据


c.shape = 2,6

Clipboard Image.png

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


c[0,4] = 1234
a

Clipboard Image.png

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


切换数组返回其视图:

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

Clipboard Image.png

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


深层复制

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

d = a.copy()                         
d is a

Clipboard Image.png

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


d.base is a 

Clipboard Image.png

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


d[0,0] = 9999
a

Clipboard Image.png

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


函数和方法概述

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

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

Clipboard Image.png

今天更新内容比较少,太累了。

推荐 3
本文由 ID王大伟 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

1 个评论

np.hsplit(a,(3,4)) 截图有误

要回复文章请先登录注册