我爱编程

2018-03-18-数学不好的Scipy入门(一)

2018-03-19  本文已影响0人  0xC00005

前言

科学计算是什么,能吃吗?
最近迷上数据收集,然而我数学不过关连线性代数集并查都不知道是什么东西【嘻嘻嘻】
越写越蒙,所以打算从头学一遍Scipy软件生态圈下面的科学计算三巨头:

用来写多维数组

用来制作表格

用来绘图和生成表格

小白错误警告!小白错误警告!

本人并没有写过Numpy,所以我跟你们一样也是从零开始学
如果有dalao发现我什么地方写的不对,或者发生小白错误误人子弟的话,赶紧发邮件骂人,我我我马上修改【发抖】
email:0xc00005.gmail.com

Numpy的简单入门

0x01 安装

虽然我已经入手了Anaconda,自带Numpy,但是为了安全起见我还是再次检查了一下安装包,然后import

pip install numpy

因为numpy这个单词实在是太鸡儿长了,所以一般我们会把他简写成np

import numpy as np 

PS:注意导入的时候的大小写

以后用到Numpy的话直接就用np.函数名就ok了

0x02 多维数组

其实入手Numpy主要还是为了多维数组这个数据结构【其他的数据结构不会用】
NumPy 中定义的最重要的对象是称为 ndarray 的 N 维数组类型。

#生成一个一维数组
import numpy as np 
a = np.array([1,2,3])  
print a
[1,2,3]

#生成一个多维数组  
a = np.array([[1,  2],  [3,  4]])  
print a

[[1, 2] 
 [3, 4]]

记住是在列表里面写列表,像C++那样的Narray[10][10][10]

ndarray.ndmin

这个方法返回当前多维数组的维度,什么意思呢
比如a[10]这就叫一维数组
a[10][10]在a的第十行第十列就是二维数组了
以此类推.....
或者更简单一点来说,如果你的数组是线性,ndim就是1
正方形就是2,立方体就是3,4维的东西是什么我还不知道你给我科普一下?

import numpy as np

array = np.array([[1,2,3],[4,5,6]])
print(array.ndim)

输出如下:
2

ndarray.shape

这个方法返回一个包含数组维度的元组,它也可以用于调整数组大小。

import numpy as np 
a = np.array([[1,2,3],[4,5,6]])  
print a.shape

输出如下:
(2, 3)

如果你想要调整a的长宽高什么的,可以使用array的shape(形状)方法

# 这会调整数组大小  
import numpy as np 

a = np.array([[1,2,3],[4,5,6]]) a.shape =  (3,2)  
print a
输出如下:
[[1, 2] 
 [3, 4] 
 [5, 6]]

如果你想要复制调整后的数据然后不改动原来的数据,NumPy 也提供了reshape函数来调整数组大小,这里的数据是可以复制的且不会影响原来的数据

import numpy as np 
a = np.array([[1,2,3],[4,5,6]]) 
b = a.reshape(3,2)  
print b
输出如下:
[[1, 2] 
 [3, 4] 
 [5, 6]]

ndarray.size

这个方法可以返回一共有多少元素在这个多维数组里面,就相当于遍历了一遍

import numpy as np 
a = np.array([[1,2,3],[4,5,6]])  
print a.size

输出如下:
6

0x03 dtype!Numpy里面的数据类型

每一种array我们都可以定义他的type,是用小数形式存在呢还是整数形式
这些我们都可以在最开始创建他的时候进行一个定义
array的type叫做dtype【智障名字每次我都记错】、
在Numpy里面有一些自带的格式,但是注意使用这些格式之前我们需要在前面加上一个np.格式符 表格我贴在下面了

import numpy as np
a = np.array([2,3,4],dtype=np.int)
print(a.dtype)
输出如下:
int64

我们也可以把他们改成小数形式(float),只要改变dtype里面的值就可以了
32和64的区别就相当于short和long long吧,通常来说位数越小所占用的空间也就越小,但是精确的话占用的内存和空间也会很大

如果是多维数组的话:

a = np.array([[1,2],[3,4],[5,6]],dtype=np.int)
#记住前面写完了每行最后外面一定一定要打一个中括号

祭出我的数据类型表:

序号 数据类型及描述
1. bool_ 存储为一个字节的布尔值(真或假)
2. int_ 默认整数,相当于 C 的long,通常为int32或int64
3. intc 相当于 C 的int,通常为int32或int64
4. intp 用于索引的整数,相当于 C 的size_t,通常为int32或int64
5. int8 字节(-128 ~ 127)
6. int16 16 位整数(-32768 ~ 32767)
7. int32 32 位整数(-2147483648 ~ 2147483647)
8. int64 64 位整数(-9223372036854775808 ~ 9223372036854775807)
9. uint8 8 位无符号整数(0 ~ 255)
10. uint16 16 位无符号整数(0 ~ 65535)
11. uint32 32 位无符号整数(0 ~ 4294967295)
12. uint64 64 位无符号整数(0 ~ 18446744073709551615)
13. float_ float64的简写
14. float16 半精度浮点:符号位,5 位指数,10 位尾数
15. float32 单精度浮点:符号位,8 位指数,23 位尾数
16. float64 双精度浮点:符号位,11 位指数,52 位尾数
17. complex_ complex128的简写
18. complex64 复数,由两个 32 位浮点表示(实部和虚部)
19. complex128 复数,由两个 64 位浮点表示(实部和虚部)

0x04 基本的数组生成和定义

下面是一些初始化的栗子:

numpy.empty

它创建指定形状和dtype的未初始化数组。 它使用以下构造函数:
numpy.empty(shape, dtype = float, order = 'C')

下面的代码展示空数组的例子:
import numpy as np 
x = np.empty([3,2], dtype =  int)  
print x
输出如下:
[[22649312    1701344351] 
 [1818321759  1885959276] 
 [16779776    156368896]]

注意:数组元素为随机值,因为它们未初始化。【神奇的C++模样】

numpy.zeros

返回特定大小,以 0 填充的新数组。
numpy.zeros(shape, dtype = float, order = 'C')

示例 1
# 含有 5 个 0 的数组,默认类型为 float  
import numpy as np 
x = np.zeros(5)  
print x
输出如下:
[ 0.  0.  0.  0.  0.]
示例 2
import numpy as np 
x = np.zeros((5,), dtype = np.int)  
print x
输出如下:
[0  0  0  0  0]
示例 3
# 生成矩阵
 a = np.zeros((3,4))
print(a)
输出如下:
 [[ 0.  0.  0.  0.]
 [ 0.  0.  0.  0.]
 [ 0.  0.  0.  0.]]

值得一提的是这边默认的数据类型都是float【看那小数点】

numpy.ones

返回特定大小,以 1 填充的新数组。
numpy.ones(shape, dtype = None, order = 'C')

示例 1
# 含有 5 个 1 的数组,默认类型为 float  
import numpy as np 
x = np.ones(5)  print x
输出如下:
[ 1.  1.  1.  1.  1.]
示例 2
import numpy as np 
x = np.ones([2,2], dtype =  int)  
print x
输出如下:
[[1  1] 
 [1  1]]

np.arange

看arange这个单词,是不是很像range啊
这个函数的作用是生成一个数列,跟range一模一样

import numpy as np
a = np.arange(10,20,2)
print(a)
输出如下:
[10 12 14 16 18]

np.linspace

np.linspace(初始点,结束点,单位长度)
这个差不读就是生成一个等差数列吧,单位长度的意思即使初始点和结束中有多少个等差的数字

import numpy as np
a = np.linspace(1,10,20)
print(a)
print(a.size)#这里我看一下到底是不是有20个元素在里面
输出如下:
[  1.           1.47368421   1.94736842   2.42105263   2.89473684
   3.36842105   3.84210526   4.31578947   4.78947368   5.26315789
   5.73684211   6.21052632   6.68421053   7.15789474   7.63157895
   8.10526316   8.57894737   9.05263158   9.52631579  10.        ]
20

后记

颤抖着写完....
想不到C++除了快竟然还以地方比Python好用,直接定义多维数组太爽了

nArray=[[1,2][3,4][5,6]]
Traceback (most recent call last):

  File "<ipython-input-36-95ddd256759d>", line 1, in <module>
    nArray=[[1,2][3,4][5,6]]

TypeError: list indices must be integers or slices, not tuple

大胆的尝试.gif

参考链接:
神奇的Numpy教程
就是这个南京大学把我劝去学科学计算的

最后的最后

来Max的Blog撩小姐姐吧

上一篇下一篇

猜你喜欢

热点阅读