2018-03-18-数学不好的Scipy入门(一)
前言
科学计算是什么,能吃吗?
最近迷上数据收集,然而我数学不过关连线性代数集并查都不知道是什么东西【嘻嘻嘻】
越写越蒙,所以打算从头学一遍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教程
就是这个南京大学把我劝去学科学计算的