(这是第一次作为小白参加Datawhale的学习,好多东西都是第一次接触,但是万事开头难,通过一点一点的询问和自己摸索,终于有了一点点头绪,但是从来没有接触过的numpy真的是让人头大,希望自己能够坚持下去,真正学有所成)
numpy.nan
nan=NaN=NAN
两个numpy.nan是不一样的,也就两者不能划等号。
以下是几个常见的常量:
numpy.inf(表示正无穷大);
numpy.pi(表示圆周率(pi在c语言中也表示圆周率,如果没记错的话,哈哈哈));
numpy.e(表示自然常数,就是数学中的e);
Python 原生的数据类型相对较少, bool、int、float、str等。这在不需要关心数据在计算机中表示的所有方式的应用中是方便的。然而,对于科
学计算,通常需要更多的控制。为了加以区分 numpy 在这些类型名称末尾都加了“_”。
下图表列举常用的numpy基本类型(啊,这里是直接copy的原图)
numpy的数值类型实际上是dtype对象的实例,在这里说明一下“dtype”是什么。
在python环境下运行一下代码,用print打印出来后,其代码展示如下:
import numpy
print(numpy.dtype.__doc__)
dtype(obj, align=False, copy=False)
Create a data type object.
A numpy array is homogeneous, and contains elements described by a
dtype object. A dtype object can be constructed from different
combinations of fundamental numeric types.
通过以上结果我们可以知道,1、dtype函数数组元素类型,数组元素类型可以通过dtype属性来获得;2、dtype也可以作为参数创建特定的类型的数组;3、dtype可查看数组的数据类型。
Python 的浮点数通常是64位浮点数,几乎等同于 np.float64 。
NumPy和Python整数类型的行为在整数溢出方面存在显着差异,与 NumPy 不同,Python 的 int 是灵活的。这意味着Python整数可以扩展以容
纳任何整数并且不会溢出。
其代码展示如下:
import numpy as np
ii16 = np.iinfo(np.int16)
print(ii16.min)
print(ii16.max)
ii32 = np.iinfo(np.int32)
print(ii32.min)
print(ii32.max)
###输出的结果分别为:
-32768
32767
-2147483648
2147483647
在 numpy 中,我们很方便的将字符串转换成时间日期类型 datetime64 ( datetime 已被 python 包含的日期时间库所占用)。
datatime64 是带单位的日期时间类型,其单位如下:
(copy原文档)
注意:
从字符串创建 datetime64 类型时,默认情况下,numpy 会根据字符串自动选择对应的单位。
其代码展示如下:
import numpy as np
a = np.datetime64('2020-03-01')
print(a,a.dtype)
##运行结果过为:2020-03-01 datetime64[D]
以上代码表示的是在numpy中,datetime64这个字符串后跟着的是日期,那么print后,a这一变量由dtype标出的类型就是【D】,也就是“天的意思”;同样的道理,当定义不同的日期表达时,print后就能输出对应的类型。
import numpy as np
a = np.datetime64('2020-03')
print(a,a.dtype)
import numpy as np
a = np.datetime64('2020-03-08 20:00:05')
print(a,a.dtype)
import numpy as np
a = np.datetime64('2020-03-05 15:00')
print(a,a.dtype)
这里需要注意一下,日常生活中我们常用的时间单位诸如年、月、日/天、小时、分钟、秒等。通过代码的运行可以得知,在输入“时”、“分钟”、“秒”时,要注意格式的细微变化。否则会出现错误,其代码展示如下:
import numpy as np
a = np.datetime64('2020-03-05 0:00')
print(a,a.dtype)
ValueError Traceback (most recent call last)
<ipython-input-12-37e3655e4458> in <module>
1 import numpy as np
2
----> 3 a = np.datetime64('2020-03-05 0:00')
4 print(a,a.dtype)
ValueError: Error parsing datetime string "2020-03-05 0:00" at position 11
可以看出,仅仅少些了以为,就出错了,正确的代码展示如下:
import numpy as np
a = np.datetime64('2020-03-05 00:00')
print(a,a.dtype)
从字符串创建 datetime64 类型时,可以强制指定使用的单位,其代码展示如下:
import numpy as np
a= np.datetime64('2020-03','D')
print(a,a.dtype)
a= np.datetime64('2020-03','Y')
print(a,a.dtype)
2020-03-01 datetime64[D]
2020 datetime64[Y]
由上例可以看出,2019-03 和 2019-03-01 所表示的其实是同一个时间。
事实上,如果两个 datetime64 对象具有不同的单位,它们可能仍然代表相同的时刻。并且从较大的单位(如月份)转换为较小的单位(如天
数)是安全的
从字符串创建 datetime64 数组时,如果单位不统一,则一律转化成其中最小的单位,其代码展示如下:
import numpy as np
a= np.array(['2020-03','2020-03-08','2020-03-08 20:00'],dtype = 'datetime64')
print(a,a.dtype)
['2020-03-01T00:00' '2020-03-08T00:00' '2020-03-08T20:00'] datetime64[m]
请注意,在这里已经构造了一个数组,注意数组的标准写法与格式,“【】”一定不要忘了(第一次运行的时候,总是出现各种错误,慢慢找才发现是符号的问题,在编程语言中一定要特别注意格式!)
接下来,用“arrange()”创建datetime64数组,用来生成日期范围,其代码展示如下:
import numpy as np
a = np.arange('2020-08-01','2020-08-10',dtype=np.datetime64)
print(a,a.dtype)
##结果如下:
['2020-08-01' '2020-08-02' '2020-08-03' '2020-08-04' '2020-08-05'
'2020-08-06' '2020-08-07' '2020-08-08' '2020-08-09'] datetime64[D]
这个代码展示的就是从‘202008-01’到‘2020-08-10’的天数,并且输入了类型为“D”,说明代码运行的正确。
相同的输入对应的其他日期表达方式,不在一一列举。
timedelta64 表示两个 datetime64 之间的差。timedelta64 也是带单位的,并且和相减运算中的两个 datetime64 中的较小的单位保持一致。
可以举个例子具体说明,其胆码展示如下:
import numpy as np
a = np.datetime64('2020-03-08') - np.datetime64('2020-03-07')
b = np.datetime64('2020-03-08') - np.datetime64('2020-03-07 08:00')
c = np.datetime64('2020-03-08') - np.datetime64('2020-03-07 23:00','D')
print(a,a.dtype)
print(b,b.dtype)
print(c,c.dtype)
##结果如下:
1 days timedelta64[D]
960 minutes timedelta64[m]
1 days timedelta64[D]
这里分别解释一下每一行代码运行的意思,第一行是非常标准的“日” - “日”的运算,所以输出的类型为“D”;第二行是“日” - “分钟”的运算,由规定可知,按照单位较小的输出结果,因此输出结果的类型为“minute”,也就是分钟;第三行表示的同样为“日” - “分钟”,但在代码的最后强制转化为“天”,所以最后输出的结果也就是“D”了。
先展示一个代码:
import numpy as np
a = np.array([0,1,2,3,4])
b = np.array([0,1,2,3,4])
print(a,type(a))
print(b,type(b))
c = np.array([[11,12,13,14,15],
[45,12,35,78,12],
[12,85,3,45,78],
[11,54,61,23,84],
[65,45,32,31,78]])
print(c,type(c))
d = np.array([[(1.5,2,3),(4,5,6)],
[(5,7,9),(5,6,3.1)]])
print(d,type(d))
##结果运行如下:
[0 1 2 3 4] <class 'numpy.ndarray'>
[0 1 2 3 4] <class 'numpy.ndarray'>
[[11 12 13 14 15]
[45 12 35 78 12]
[12 85 3 45 78]
[11 54 61 23 84]
[65 45 32 31 78]] <class 'numpy.ndarray'>
[[[1.5 2. 3. ]
[4. 5. 6. ]]
[[5. 7. 9. ]
[5. 6. 3.1]]] <class 'numpy.ndarray'>
以上代码分别展示了创建一维、二维以及三维数组的表达,特别注意输出数组的类型是,不再是“print(a,a.dtype)”这种形式了,而是“print(a,type(a))”。
array() 和 asarray() 都可以将结构数据转化为 ndarray,但是 array() 和 asarray() 主要区别就是当数据源是ndarray 时, array() 仍
然会 copy 出一个副本,占用新的内存,但不改变 dtype 时 asarray() 不会。(因此看来,asarray更节省内存空间一些。)
举例展示,其代码展示如下:
import numpy as np
x = [[1,1,1],[4,8,3],[2,4,5]]
y = np.array(x)
z = np.asarray(x)
print(x,type(x))
print(y,type(y))
print(z,type(z))
##结果如下:
[[1, 1, 1], [4, 8, 3], [2, 4, 5]] <class 'list'>
[[1, 1, 1], [4, 8, 3], [2, 4, 5]] <class 'list'>
array() 和 asarray() 的区别。( array() 和 asarray() 主要区别就是当数据源是ndarray 时, array() 仍然会 copy 出一个副
本,占用新的内存,但不改变 dtype 时 asarray() 不会。
其代码展示如下:
import numpy as np
x = [[1,1,1],[4,8,3],[2,4,5]]
y = np.array(x)
z = np.asarray(x)
w = np.asarray(x,dtype=np.int)
x[1][2] = 2
print(x,type(x))
print(y,type(y))
print(z,type(z))
##结果如下:
[[1, 1, 1], [4, 8, 2], [2, 4, 5]] <class 'list'>
[[1 1 1]
[4 8 3]
[2 4 5]] <class 'numpy.ndarray'>
[[1 1 1]
[4 8 3]
[2 4 5]] <class 'numpy.ndarray'>
在机器学习任务中经常做的一件事就是初始化参数,需要用常数值或者随机值来创建一个固定大小的矩阵。
import numpy as np
x = np.zeros(5)
print(x)
x = np.zeros([4,5])
print(x)
x = np.array([[4,5,7],[12,47,89]])
y = np.zeros_like(x)
print(y)
##结果如下:
[0. 0. 0. 0. 0.]
[[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]]
[[0 0 0]
[0 0 0]]
以上代码表示其含义比较简单,不在赘述。
1数组的形式与0零数组完全一样,只不过数组内的各个元素均换成1,此处不在对其代码进行展示。
其代码展示如下:
import numpy as np
x = np.empty(5)
print(x)
x = np.empty([5,7])
x = np.array([[45,62,78,89],[12,5,46,31]])
y = np.empty_like(x)
print(y)
##结果如下:
[0. 0. 0. 0. 0.]
[[1324770695 805393421 1599436526 1645630477]
[1745310583 1825934317 1801670157 805468270]]
其代码展示如下:
import numpy as np
x = np.eye(5)
print(x)
x = np.eye(2,3)
print(x)
x = np.identity(4)
print(x)
##结果如下;
[[1. 0. 0. 0. 0.]
[0. 1. 0. 0. 0.]
[0. 0. 1. 0. 0.]
[0. 0. 0. 1. 0.]
[0. 0. 0. 0. 1.]]
[[1. 0. 0.]
[0. 1. 0.]]
[[1. 0. 0. 0.]
[0. 1. 0. 0.]
[0. 0. 1. 0.]
[0. 0. 0. 1.]]
其代码展示如下:
import numpy as np
x = np.arange(9).reshape((3,3))
print(x)
print(np.diag(x))
print(np.diag(a,k=1))
print(np.diag(x,k=-1))
s = [5,8,79,2,13,45,67,75,42]
x = np.diag(v)
print(x)
##结果如下:
[[0 1 2]
[3 4 5]
[6 7 8]]
[0 4 8]
[1 5]
[3 7]
[[ 5 0 0 0 0 0 0 0 0]
[ 0 8 0 0 0 0 0 0 0]
[ 0 0 79 0 0 0 0 0 0]
[ 0 0 0 2 0 0 0 0 0]
[ 0 0 0 0 13 0 0 0 0]
[ 0 0 0 0 0 45 0 0 0]
[ 0 0 0 0 0 0 67 0 0]
[ 0 0 0 0 0 0 0 75 0]
[ 0 0 0 0 0 0 0 0 42]]
先暂时写到这里,这是第一次学习numpy,编程本来就没有学习大多数,所以学习起来比较吃力,但是也有了一定的收货,白天全是课,只有晚上有时间学一点,所以接下来一定更加努力,不然就要掉队了