【datawhale】-numpy学习-数组创建

【Datawhale】-numpy-数据类型及数组创建

  • 前言
  • 常量
  • 数据类型
    • 常见数据类型
    • 创建数据类型
    • 数据类型信息
  • 时间日期和时间增量
    • datatime64基础
    • datatime 64和timedelta64运算
  • 数组的创建
    • 依据现有数据来创建ndarray
      • 通过array()函数进行创建
      • 通过asarray()函数进行创建
    • 依据ones和zeros填充方式
      • 零数组
      • 1数组
      • 空数组
      • 单位数组
      • 对角数组
  • 小结与体会

前言

(这是第一次作为小白参加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的原图)
【datawhale】-numpy学习-数组创建_第1张图片

创建数据类型

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

时间日期和时间增量

datatime64基础

在 numpy 中,我们很方便的将字符串转换成时间日期类型 datetime64 ( datetime 已被 python 包含的日期时间库所占用)。
datatime64 是带单位的日期时间类型,其单位如下:
(copy原文档)
【datawhale】-numpy学习-数组创建_第2张图片
注意:

  1. 1秒 = 1000 毫秒(milliseconds) 2. 1毫秒 = 1000 微秒(microseconds)

从字符串创建 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”,说明代码运行的正确。
相同的输入对应的其他日期表达方式,不在一一列举。

datatime 64和timedelta64运算

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”了。

数组的创建

依据现有数据来创建ndarray

通过array()函数进行创建

先展示一个代码:


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))”。

通过asarray()函数进行创建

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'>

依据ones和zeros填充方式

在机器学习任务中经常做的一件事就是初始化参数,需要用常数值或者随机值来创建一个固定大小的矩阵。

零数组

  1. zeros() 函数:返回给定形状和类型的零数组。
  2. zeros_like() 函数:返回与给定数组形状和类型相同的零数组。
    下面展示这两个函数具体运行的一个案列结果,其代码展示如下:
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数组

  1. ones() 函数:返回给定形状和类型的1数组。
  2. ones_like() 函数:返回与给定数组形状和类型相同的1数组。

1数组的形式与0零数组完全一样,只不过数组内的各个元素均换成1,此处不在对其代码进行展示。

空数组

  1. empty() 函数:返回一个空数组,数组元素为随机数。
  2. empty_like 函数:返回与给定数组具有相同形状和类型的新数组。

其代码展示如下:

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]]

单位数组

  1. eye() 函数:返回一个对角线上为1,其它地方为零的单位数组。
  2. identity() 函数:返回一个方的单位数组。

其代码展示如下:

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.]]


对角数组

  1. diag() 函数:提取对角线或构造对角数组。

其代码展示如下:

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,编程本来就没有学习大多数,所以学习起来比较吃力,但是也有了一定的收货,白天全是课,只有晚上有时间学一点,所以接下来一定更加努力,不然就要掉队了

你可能感兴趣的:(datawha,笔记)