Python科学计算之简单环境搭建

这个是对于Python做科学计算,一张相对完整的思维导图

在以前的科学计算是没有conda的地位的,都是这个python(x,y)的项目

你可以尝试的使用,我这里就是一个推荐

https://python-xy.github.io/
https://python-xy.github.io/downloads.html
https://cn.bing.com/?FORM=Z9FD1

这里我安利一下,微软的搜索

我们主要用ipython来学习,之后用Ide来工作

我们想在开机运行的时候就运行一段代码

import numpy as npimport scipy as spimport pylab as plfrom numpy import *

我们这里用-i的选项,引入环境

$ ipython [options] files

如果在没有选项的情况下调用,它将执行按顺序列出的所有文件,并将您放到解释器中,同时仍然确认您在ipythonrc档案。这种行为与标准Python不同,标准Python被称为python -i将只执行一个文件并忽略配置设置。

$ ipython -i myfile.py

我这里没有什么在打开的一瞬间就引入库的好办法,这里先手动

会报错,你的版本可能不会

将这库降级

pip install --upgrade 'jedi<0.18.0'

然后试试有没有成功

也可以直接的使用一些cmd命令

我们这里IDE使用Spyder是python(x,y)的项目的进化版

spyder是Python(x,y)的作者为它开发的一个简单的Python开发环境。和其它Python IDE相比它最大 的优点就是模仿MATLAB的workspace功能,可以很方便地观察和修改数组的值。

通过给array函数传递Python的序列对象创建数组,如果传递的是多层嵌套的序列,将创建多 维数组

import numpy as npa = np.array([1, 2, 3, 4])b = np.array((5, 6, 7, 8))c = np.array([[1, 2, 3, 4],[4, 5, 6, 7], [7, 8, 9, 10]])

我们这里先创建一些数组

打印的结果

可以有一些方法,查询变量类型+数据结构大小


数组a的shape只有一个元素,因此它是一维数组。

而数组c的shape有两个元素,因此它是二维数组, 其中第0轴的长度为3,第1轴的长度为4。

还可以通过修改数组的shape属性,在保持数组元素个数不 变的情况下,改变数组每个轴的长度。

下面的例子将数组c的shape改为(4,3),注意从(3,4)改为(4,3)并 不是对数组进行转置,而只是改变每个轴的大小,数组元素在内存中的位置并没有改变:

各个大小的数组大小

原有的大小

变换后的大小


当某个轴的元素为-1时,将根据数组元素的个数自动计算此轴的长度,因此下面的程序将数组c的 shape改为了(2,6):


输出的结果


使用数组的reshape方法,可以创建一个改变了尺寸的新数组,原数组的shape保持不变:

输出的结果

可以看到a,b的数据是共享一快内存的

你会问为什么?

你看就是这样,我对a[1]元素做了更改


数组的元素类型可以通过dtype属性获得。

上面例子中的参数序列的元素都是整数,因此所创建的数组 的元素类型也是整数,并且是32bit的长整型。

可以通过dtype参数在创建时指定元素类型:

红字部分就是元素类型的参数


上面的例子都是先创建一个Python序列,然后通过array函数将其转换为数组,这样做显然效率不高。

可以直接使用现成的函数来进行数据列的生成


arange函数类似于python的range函数,通过指定开始值、终值和步长来创建一维数组,注意 数组不包括终值

linspace函数通过指定开始值、终值和元素个数来创建一维数组,可以通过endpoint关键字指定 是否包括终值,缺省设置是包括终值

logspace函数和linspace类似,不过它创建等比数列,上面的例子产生1(10^0)到100(10^2)、 有20个元素的等比数列

使用frombuffer, fromstring, fromfile等函数可以从字节序列创建数组


Python的字符串实际上是字节序列,每个字符占一个字节,因此如果从字符串s创建一个8bit的整数数 组的话,所得到的数组正好就是字符串中每个字符的ASCII编码

如果从字符串s创建16bit的整数数组,那么两个相邻的字节就表示一个整数,把字节98和字节97当作 一个16位的整数,它的值就是98*256+97 = 25185。

可以看出内存中是以little endian(低位字节在 前)方式保存数据的。

如果把整个字符串转换为一个64位的双精度浮点数数组,那么它的值是以上


显然这个例子没有什么意义,但是可以想象如果我们用C语言的二进制方式写了一组double类型的数 值到某个文件中,那们可以从此文件读取相应的数据,并通过fromstring函数将其转换为float64类型 的数组。

与C语言的集成是另外一个有趣的故事

以上函数将数组下标转换为数组中对应的值,然后使用fromfunction函数创建数组.

fromfunction函数的第一个参数为计算每个数组元素的函数,第二个参数为数组的大小(shape),因为 它支持多维数组,所以第二个参数必须是一个序列,本例中用(10,)创建一个10元素的一维数组。

这不,就是一个9x9的乘法表

在其上面就像matlab一样的变量表

可以直接的编辑这些元素

可以直接绘图

这样就可以直接的绘图出来

[1,2,3,4]import numpy as npa = np.array([1, 2, 3, 4])b = np.array((5, 6, 7, 8))c = np.array([[1, 2, 3, 4],[4, 5, 6, 7], [7, 8, 9, 10]])%varexp --plot b%varexp --hist aabcc.dtypea.shapeb.shapec.shapec.shape = 4,3cc.shape = 2,-1cd = a.reshape((2,2))daa[1]=7adnp.array([[1, 2, 3, 4],[4, 5, 6, 7], [7, 8, 9, 10]], dtype=np.float)np.array([[1, 2, 3, 4],[4, 5, 6, 7], [7, 8, 9, 10]], dtype=np.complex)np.arange(0,1,0.1)np.linspace(0, 1, 12)np.logspace(0, 2, 20)s = "abcdefgh"np.fromstring(s, dtype=np.int8)np.fromstring(s, dtype=np.int16)np.fromstring(s, dtype=np.float)def func(i): return i%4+1 np.fromfunction(func, (10,))def func2(i, j): return (i+1) * ( j+1) a = np.fromfunction(func2, (9,9))a%varexp --plot c%varexp --plot b

以上的代码是以上我写的所有代码,有需要复制使用的朋友可以直接使用

(0)

相关推荐