当前位置:   article > 正文

Python基础学习——Numpy包(1、数据类型及数组创建)_python 创建数组 astype

python 创建数组 astype

1.数据类型及数组创建

1.1常量

numpy.nan(numpy.NaN,numpy.NAN)

not a number,表示非数值、空值nan。

  1. 两个空值是不相等的
  2. numpy.isnan()用来判断是否是空值,是空值返回True,否则为False。只有nan表示空值,0并不是空值
numpy.inf(Inf = inf = infty = Infinity = PINF)正无穷大inf
numpy.piπ,3.1415926535897932384...
numpy.e自然常数e,2,718281828....

1.2数据类型

1.2.1数据类型对象(numpy.dtype类的实例)

dtype对象的构造:

  1. class dtype(object):
  2. def __init__(self, obj, align=False, copy=False):
  3. pass

使用时:numpy.dtype(object,align,copy)

  • object:要转换成为的数据类型
  • align:如果为True,填充字段使其类似C的结构体
  • copy:复制dtype对象,如果为false,则是对内置数据类型对象的引用

下表列举了常用 numpy 基本类型。

类型备注说明
bool_ = bool88位布尔类型
int8 = byte8位整型
int16 = short16位整型
int32 = intc32位整型
int_ = int64 = long = int0 = intp64位整型
uint8 = ubyte8位无符号整型
uint16 = ushort16位无符号整型
uint32 = uintc32位无符号整型
uint64 = uintp = uint0 = uint64位无符号整型
float16 = half16位浮点型
float32 = single32位浮点型
float_ = float64 = double64位浮点型
str_ = unicode_ = str0 = unicodeUnicode 字符串
datetime64日期时间类型
timedelta64表示两个时间之间的间隔

每个内建类型都有一个唯一定义它的字符代码,如“i4”简写可用来代替numpy.int32,如下:

字符对应类型备注
bboolean'b1'
isigned integer'i1', 'i2', 'i4', 'i8'
uunsigned integer'u1', 'u2' ,'u4' ,'u8'
ffloating-point'f2', 'f4', 'f8'
ccomplex floating-point
mtimedelta64表示两个时间之间的间隔
Mdatetime64日期时间类型
Oobject
S(byte-)stringS3表示长度为3的字符串
UUnicodeUnicode 字符串
Vvoid

numpy.dtype(): 返回数据结构中数据元素的类型,其中的元素类型必须统一,因此list、dict没有dtype,np.array有

numpy.dtype.itemsize():此类数据类型对象的元素大小(字节)

numpy.array.astype():改变array中数据元素的类型

  1. import numpy as np
  2. a = np.dtype('b1')
  3. print(a.type) # <class 'numpy.bool_'>
  4. print(a.itemsize) # 1
  5. a = np.dtype('i1')
  6. print(a.type) # <class 'numpy.int8'>
  7. print(a.itemsize) # 1
  8. a = np.dtype('i2')
  9. print(a.type) # <class 'numpy.int16'>
  10. print(a.itemsize) # 2
  11. a = np.dtype('i4')
  12. print(a.type) # <class 'numpy.int32'>
  13. print(a.itemsize) # 4
  14. a = np.dtype('i8')
  15. print(a.type) # <class 'numpy.int64'>
  16. print(a.itemsize) # 8
  17. a = np.dtype('u1')
  18. print(a.type) # <class 'numpy.uint8'>
  19. print(a.itemsize) # 1
  20. a = np.dtype('u2')
  21. print(a.type) # <class 'numpy.uint16'>
  22. print(a.itemsize) # 2
  23. a = np.dtype('u4')
  24. print(a.type) # <class 'numpy.uint32'>
  25. print(a.itemsize) # 4
  26. a = np.dtype('u8')
  27. print(a.type) # <class 'numpy.uint64'>
  28. print(a.itemsize) # 8
  29. a = np.dtype('f2')
  30. print(a.type) # <class 'numpy.float16'>
  31. print(a.itemsize) # 2
  32. a = np.dtype('f4')
  33. print(a.type) # <class 'numpy.float32'>
  34. print(a.itemsize) # 4
  35. a = np.dtype('f8')
  36. print(a.type) # <class 'numpy.float64'>
  37. print(a.itemsize) # 8
  38. a = np.dtype('S')
  39. print(a.type) # <class 'numpy.bytes_'>
  40. print(a.itemsize) # 0
  41. a = np.dtype('S3')
  42. print(a.type) # <class 'numpy.bytes_'>
  43. print(a.itemsize) # 3
  44. a = np.dtype('U3')
  45. print(a.type) # <class 'numpy.str_'>
  46. print(a.itemsize) # 12

1.2.2结构化数据类型(详见1.4.4利用数据结构来创建数组

类型字段和对应实际类型将被创建。

  1. import numpy as np
  2. #创建结构化数据类型
  3. dt = np.dtype([('age',np.int8)])
  4. print(dt) #[('age','i1')]
  5. #将数据类型应用于ndarray对象
  6. a = np.array([(10,),(20,),(30,)],dtype=dt)
  7. print(a) #[(10,) (20,) (30,)]
  8. #类型字段名可以用于存取实际的age列
  9. print(a['age']) #[10 20 30]
  10. #定义一个结构化数据类型student,并将这个dtype应用到ndarray
  11. student = np.dtype([('name','S20'),('age','i1'),('mark','f4')])
  12. b = np.array([('leah',21,90),('mike',18,75)],dtype=student)
  13. print(b) #[(b'leah', 21, 90.) (b'mike', 18, 75.)]
  14. print(b['name']) #[b'leah' b'mike']
  15. print(b['age']) #[21 18]
  16. print(b['mark']) #[90. 75.]

问题1:为什么将数据类型改成‘S3’后,字符串前面加了个b?

  1. import numpy as np
  2. dt = np.dtype('S3')
  3. a = np.array([('asd',)],dt)
  4. print(a)
  5. result:[[b'asd']]

1.3时间日期和时间增量

1.3.1 datetime64基础

在 numpy 中,我们很方便地将字符串转换成时间日期类型datetime64,datetime64是带单位的日期时间类型,其单位如下:

日期单位代码含义时间单位代码含义
Yh小时
Mm分钟
Ws
Dms毫秒
--us微秒
--ns纳秒
--ps皮秒
--fs飞秒
--as阿托秒

注意:

  • 1秒 = 1000 毫秒(milliseconds)
  • 1毫秒 = 1000 微秒(microseconds)

【例1】从字符串创建 datetime64 类型时(格式为‘year-month-day time’),默认情况下,numpy 会根据字符串自动选择对应的单位

  1. import numpy as np
  2. a = np.datetime64('2020-03-01')
  3. print(a, a.dtype) # 2020-03-01 datetime64[D]
  4. a = np.datetime64('2020-03')
  5. print(a, a.dtype) # 2020-03 datetime64[M]
  6. a = np.datetime64('2020-03-08 20:00:05')
  7. print(a, a.dtype) # 2020-03-08T20:00:05 datetime64[s]
  8. a = np.datetime64('2020-03-08 20:00')
  9. print(a, a.dtype) # 2020-03-08T20:00 datetime64[m]
  10. a = np.datetime64('2020-03-08 20')
  11. print(a, a.dtype) # 2020-03-08T20 datetime64[h]

【例2】从字符串创建 datetime64 类型时,可以强制指定使用的单位。

  1. import numpy as np
  2. a = np.datetime64('2020-03', 'D')
  3. print(a, a.dtype) # 2020-03-01 datetime64[D]
  4. a = np.datetime64('2020-03', 'Y')
  5. print(a, a.dtype) # 2020 datetime64[Y]
  6. print(np.datetime64('2020-03') == np.datetime64('2020-03-01')) # True
  7. print(np.datetime64('2020-03') == np.datetime64('2020-03-02')) #False

由上例可以看出,2019-03 和 2019-03-01所表示的其实是同一个时间,年-月-日-时-分-秒默认为第一个月第一天00:00:00。 事实上,如果两个 datetime64 对象具有不同的单位,它们可能仍然代表相同的时刻。并且从较大的单位(如月份)转换为较小的单位(如天数)是安全的。

【例3】从字符串创建 datetime64 数组时,如果单位不统一,则一律转化成其中最小的单位。

  1. import numpy as np
  2. a = np.array(['2020-03', '2020-03-08', '2020-03-08 20:00'], dtype='datetime64')
  3. print(a, a.dtype)
  4. # ['2020-03-01T00:00' '2020-03-08T00:00' '2020-03-08T20:00'] datetime64[m]

【例4】使用arange()创建 datetime64 数组,用于生成日期范围,精确至最小单位。

  1. import numpy as np
  2. a = np.arange('2020-08-01', '2020-08-10', dtype=np.datetime64) #精确到天
  3. print(a)
  4. # ['2020-08-01' '2020-08-02' '2020-08-03' '2020-08-04' '2020-08-05'
  5. # '2020-08-06' '2020-08-07' '2020-08-08' '2020-08-09'] #左闭右开
  6. print(a.dtype) # datetime64[D]
  7. a = np.arange('2020-08-01 20:00', '2020-08-10', dtype=np.datetime64) #精确到分钟
  8. print(a)
  9. # ['2020-08-01T20:00' '2020-08-01T20:01' '2020-08-01T20:02' ...
  10. # '2020-08-09T23:57' '2020-08-09T23:58' '2020-08-09T23:59']
  11. print(a.dtype) # datetime64[m]
  12. a = np.arange('2020-05', '2020-12', dtype=np.datetime64) #精确到月
  13. print(a)
  14. # ['2020-05' '2020-06' '2020-07' '2020-08' '2020-09' '2020-10' '2020-11']
  15. print(a.dtype) # datetime64[M]

1.3.2datetime64 和 timedelta64 运算 

【例1】日期时间和时间增量的加减法。timedelta64 表示两个 datetime64 之间的差。datetime64可做减法,减完后的数据类型为timedelta64形式。timedelta64 也是带单位的,并且和相减运算中的两个 datetime64 中的较小的单位保持一致。datetime64也可以与timedelta64相加。

  1. import numpy as np
  2. a = np.datetime64('2020-03-08') - np.datetime64('2020-03-07')
  3. b = np.datetime64('2020-03-08') - np.datetime64('2020-03-07 08:00')
  4. c = np.datetime64('2020-03-08') - np.datetime64('2020-03-07 23:00', 'D')
  5. #c强制转换单位为Day,不足一天按一天算,(向上取整)
  6. print(a, a.dtype) # 1 days timedelta64[D]
  7. print(b, b.dtype) # 960 minutes timedelta64[m]
  8. print(c, c.dtype) # 1 days timedelta64[D]
  9. #加法是datetime64+timedelta64,需要标明时间增量的单位
  10. a = np.datetime64('2020-03') + np.timedelta64(20, 'D')
  11. b = np.datetime64('2020-06-15 00:00') + np.timedelta64(12, 'h')
  12. print(a, a.dtype) # 2020-03-21 datetime64[D]
  13. print(b, b.dtype) # 2020-06-15T12:00 datetime64[m]

【例2】时间增量的单位转换。生成 timedelta64时,要注意年('Y')和月('M')这两个单位无法和其它单位进行运算(一年有几天?一个月有几天、几个小时?这些都是不确定的,只有如一天有24小时这样固定的才能转换)。

  1. import numpy as np
  2. a = np.timedelta64(1, 'Y')
  3. b = np.timedelta64(a, 'M')
  4. print(a) # 1 years
  5. print(b) # 12 months #year和month能转换
  6. c = np.timedelta64(1, 'h')
  7. d = np.timedelta64(c, 'm') #hour和minutes能转换
  8. print(c) # 1 hours
  9. print(d) # 60 minutes
  10. print(np.timedelta64(a, 'D'))
  11. # TypeError: Cannot cast NumPy timedelta64 scalar from metadata [Y] to [D] according to the rule 'same_kind'
  12. print(np.timedelta64(b, 'D'))
  13. # TypeError: Cannot cast NumPy timedelta64 scalar from metadata [M] to [D] according to the rule 'same_kind'

【例3】timedelta64 的运算,timedelta间可进行转换量固定的单位间的运算,精确到最小单位。 

  1. import numpy as np
  2. a = np.timedelta64(1, 'Y')
  3. b = np.timedelta64(6, 'M')
  4. c = np.timedelta64(1, 'W')
  5. d = np.timedelta64(1, 'D')
  6. e = np.timedelta64(5, 'D')
  7. print(a) # 1 years
  8. print(b) # 6 months
  9. print(a + b) # 18 months
  10. print(a - b) # 6 months
  11. print(2 * a) # 2 years
  12. print(a / b) # 2.0
  13. print(c / d) # 7.0
  14. print(c % e) # 2 days

【例4】numpy.datetime64 与 datetime.datetime 可以相互转换

  1. import numpy as np
  2. import datetime
  3. dt = datetime.datetime(year=2020, month=6, day=1, hour=20, minute=5, second=30)
  4. dt64 = np.datetime64(dt, 's')
  5. print(dt64, dt64.dtype)
  6. # 2020-06-01T20:05:30 datetime64[s]
  7. dt2 = dt64.astype(datetime.datetime)
  8. print(dt2, type(dt2))
  9. # 2020-06-01 20:05:30 <class 'datetime.datetime'>

1.3.3工作日功能

numpy.busday_offset(dates, offsets, roll='raise', weekmask='1111100', holidays=None, busdaycal=None, out=None)
  • dates,日期,格式为‘year-month-day’
  • offsets,偏移量,滚动到下一个工作日。问题2:偏移量是如何作用的?先roll后offsets
  • roll:{'raise', 'nat', 'forward', 'following', 'backward', 'preceding', 'modifiedfollowing', 'modifiedpreceding'},默认为raise,forward与backward常用。
  • weekmask:七个布尔值,用来定义哪些天是工作日。

【例1】如果当前是工作日,计算后面第offsets个工作日,如果当前日期为非工作日,默认报错。可以指定forward或backward规则来避免报错。(一个是向以后取第一个有效的工作日,一个是向以前取第一个有效的工作日)。可以指定偏移量为 0获取当前日期向前或向后最近的工作日,当然,如果当前日期本身就是工作日,则直接返回当前日期。如果offsets和forward/backward都存在,则先进行forward/backward,然后偏移到后面第offsets个工作日。

  1. import numpy as np
  2. # 2020-07-10 星期五
  3. a = np.busday_offset('2020-07-10', offsets=1)
  4. print(a) # 2020-07-13
  5. a = np.busday_offset('2020-07-11', offsets=1)
  6. print(a)
  7. # ValueError: Non-business day date in busday_offset
  8. a = np.busday_offset('2020-07-11', offsets=0, roll='forward')
  9. b = np.busday_offset('2020-07-11', offsets=0, roll='backward')
  10. print(a) # 2020-07-13
  11. print(b) # 2020-07-10
  12. a = np.busday_offset('2020-07-11', offsets=1, roll='forward')
  13. b = np.busday_offset('2020-07-11', offsets=1, roll='backward')
  14. print(a) # 2020-07-14
  15. print(b) # 2020-07-13

该功能能判断某天是否是工作日。

numpy.is_busday(dates, weekmask='1111100', holidays=None, busdaycal=None, out=None) 

【例2】返回指定日期是否是工作日。

  1. import numpy as np
  2. # 2020-07-10 星期五
  3. a = np.is_busday('2020-07-10')
  4. b = np.is_busday('2020-07-11')
  5. print(a) # True
  6. print(b) # False

【例3】统计一个datetime64[D]中的工作日天数。

  1. import numpy as np
  2. # 2020-07-10 星期五
  3. begindates = np.datetime64('2020-07-10')
  4. enddates = np.datetime64('2020-07-20')
  5. a = np.arange(begindates, enddates, dtype='datetime64')
  6. b = np.count_nonzero(np.is_busday(a))
  7. print(a)
  8. # ['2020-07-10' '2020-07-11' '2020-07-12' '2020-07-13' '2020-07-14'
  9. # '2020-07-15' '2020-07-16' '2020-07-17' '2020-07-18' '2020-07-19']
  10. print(b) # 6

1.4数组的创建 

1.4.1根据已有数据创建数组

【array()方法】

  1. import numpy as np
  2. # 创建一维数组
  3. a = np.array([0, 1, 2, 3, 4])
  4. #第一层()代表函数引用,[]代表第一行,逗号分隔代表不同列
  5. b = np.array((0, 1, 2, 3, 4)) 最内层()或[]都可
  6. print(a, type(a))
  7. print(b, type(b))
  8. # 创建二维数组
  9. #第一层()代表函数引用,第二层[]代表一整个数组,第三层[]表示一行,逗号分隔表示不同列
  10. c = np.array([[11, 12, 13, 14, 15],
  11. [16, 17, 18, 19, 20],
  12. [21, 22, 23, 24, 25],
  13. [26, 27, 28, 29, 30],
  14. [31, 32, 33, 34, 35]])
  15. print(c, type(c))
  16. # 创建三维数组
  17. #第一层()代表函数引用,第二层[]代表整个数组,第三层[]代表一层,第四层()代表一行,逗号分隔代表不同列
  18. d = np.array([[(1.5, 2, 3), (4, 5, 6)],
  19. [(3, 2, 1), (4, 5, 6)]])
  20. print(d, type(d))

【asarray()方法】

array()和asarray()都可以将结构数据转化为 ndarray,但是array()和asarray()主要区别就是当数据源是ndarray 时,array()仍然会 copy 出一个副本,占用新的内存,但不改变 dtype 时 asarray()不会。

  1. import numpy as np
  2. x = [[1, 1, 1], [1, 1, 1], [1, 1, 1]] #数据源是list
  3. y = np.array(x)
  4. z = np.asarray(x)
  5. x[1][2] = 2 #列表在引用后改变
  6. print(x)
  7. # [[1, 1, 1], [1, 1, 2], [1, 1, 1]]
  8. print(y)
  9. # [[1 1 1]
  10. # [1 1 1]
  11. # [1 1 1]]
  12. print(z)
  13. # [[1 1 1]
  14. # [1 1 1]
  15. # [1 1 1]] #array和asarray都改变
  16. x = np.array([[1, 1, 1], [1, 1, 1], [1, 1, 1]]) #数据源是ndarray
  17. y = np.array(x)
  18. z = np.asarray(x)
  19. x[1][2] = 2 #x在引用后改变
  20. print(x,x.dtype)
  21. # [[1 1 1]
  22. # [1 1 2]
  23. # [1 1 1]] int32
  24. print(y,y.dtype) #array是副本,不改变
  25. # [[1 1 1]
  26. # [1 1 1]
  27. # [1 1 1]] int32
  28. print(z,z.dtype) #未改变dtype的asarray直接引用ndarray,改变
  29. # [[1 1 1]
  30. # [1 1 2]
  31. # [1 1 1]] int32

【fromfunction()方法】

def fromfunction(function, shape, **kwargs):

【例】通过在每个坐标上执行一个函数来构造数组。

  1. import numpy as np
  2. def f(x, y):
  3. return 10 * x + y
  4. #填充与行列坐标相关的矩阵。(5,4)为矩阵形状,限制迭代次数
  5. x = np.fromfunction(f, (5, 4), dtype=int)
  6. print(x)
  7. # [[ 0 1 2 3]
  8. # [10 11 12 13]
  9. # [20 21 22 23]
  10. # [30 31 32 33]
  11. # [40 41 42 43]]
  12. #lambda i,j: ..... 定义关于坐标(i,j)的函数
  13. x = np.fromfunction(lambda i, j: i == j, (3, 3), dtype=int)
  14. print(x)
  15. # [[ True False False]
  16. # [False True False]
  17. # [False False True]]
  18. x = np.fromfunction(lambda i, j: i + j, (3, 3), dtype=int)
  19. print(x)
  20. # [[0 1 2]
  21. # [1 2 3]
  22. # [2 3 4]]

1.4.2特定值和结构的填充方法

【零数组】

zeros()函数:返回给定形状和类型的零数组。

zeros_like()函数:返回与给定数组形状和类型相同的零数组。

【例】

  1. import numpy as np
  2. x = np.zeros(5)
  3. print(x) # [0. 0. 0. 0. 0.]
  4. x = np.zeros([2, 3])
  5. print(x)
  6. # [[0. 0. 0.]
  7. # [0. 0. 0.]]
  8. x = np.array([[1, 2, 3], [4, 5, 6]])
  9. y = np.zeros_like(x)
  10. print(y)
  11. # [[0 0 0]
  12. # [0 0 0]]

【1数组】 

ones()函数:返回给定形状和类型的1数组。

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

【例】

  1. import numpy as np
  2. x = np.ones(5)
  3. print(x) # [1. 1. 1. 1. 1.]
  4. x = np.ones([2, 3])
  5. print(x)
  6. # [[1. 1. 1.]
  7. # [1. 1. 1.]]
  8. x = np.array([[1, 2, 3], [4, 5, 6]])
  9. y = np.ones_like(x)
  10. print(y)
  11. # [[1 1 1]
  12. # [1 1 1]]

【空数组】 

empty()函数:返回给定形状和类型的空数组。

empty_like()函数:返回与给定数组形状和类型相同的空数组。

【例】

  1. import numpy as np
  2. x = np.empty(5)
  3. print(x)
  4. # [1.95821574e-306 1.60219035e-306 1.37961506e-306
  5. # 9.34609790e-307 1.24610383e-306]
  6. x = np.empty((3, 2))
  7. print(x)
  8. # [[1.60220393e-306 9.34587382e-307]
  9. # [8.45599367e-307 7.56598449e-307]
  10. # [1.33509389e-306 3.59412896e-317]]
  11. x = np.array([[1, 2, 3], [4, 5, 6]])
  12. y = np.empty_like(x)
  13. print(y)
  14. # [[ 7209029 6422625 6619244]
  15. # [ 100 707539280 504]]

 【单位数组】

eye()函数:返回一个对角线上为1,其它地方为零的单位数组,可以不“方”

identity()函数:返回一个方的单位数组。

【例】

  1. import numpy as np
  2. x = np.eye(4)
  3. print(x)
  4. # [[1. 0. 0. 0.]
  5. # [0. 1. 0. 0.]
  6. # [0. 0. 1. 0.]
  7. # [0. 0. 0. 1.]]
  8. x = np.eye(2, 3)
  9. print(x)
  10. # [[1. 0. 0.]
  11. # [0. 1. 0.]]
  12. x = np.identity(4)
  13. print(x)
  14. # [[1. 0. 0. 0.]
  15. # [0. 1. 0. 0.]
  16. # [0. 0. 1. 0.]
  17. # [0. 0. 0. 1.]]

【对角数组】

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

【例】

  1. import numpy as np
  2. x = np.arange(9).reshape((3, 3))
  3. print(x)
  4. # [[0 1 2]
  5. # [3 4 5]
  6. # [6 7 8]]
  7. print(np.diag(x)) # [0 4 8]
  8. print(np.diag(x, k=1)) # [1 5]
  9. print(np.diag(x, k=-1)) # [3 7]
  10. v = [1, 3, 5, 7]
  11. x = np.diag(v)
  12. print(x)
  13. # [[1 0 0 0]
  14. # [0 3 0 0]
  15. # [0 0 5 0]
  16. # [0 0 0 7]]

【常数数组】

full()函数:返回一个常数数组。(亦可返回所有常量

full_like()函数:返回与给定数组具有相同形状和类型的常数数组。

【例】

  1. import numpy as np
  2. x = np.full((2,), 7)
  3. print(x)
  4. # [7 7]
  5. x = np.full(2, 7)
  6. print(x)
  7. # [7 7]
  8. x = np.full((2, 7), 7)
  9. print(x)
  10. # [[7 7 7 7 7 7 7]
  11. # [7 7 7 7 7 7 7]]
  12. x = np.array([[1, 2, 3], [4, 5, 6]])
  13. y = np.full_like(x, 7)
  14. print(y)
  15. # [[7 7 7]
  16. # [7 7 7]]

1.4.3利用数值范围创建

arange(start,stop,step)函数:返回给定间隔内的均匀间隔的值,给定间隔(默认1),数量自适应。

linspace()函数:返回给定间隔内的等间隔数字,给定数字数量,间隔自适应。

logspace()函数:返回数以对数刻度均匀分布。

numpy.random.rand() 返回一个由[0,1)内的随机数组成的数组。

(random系列函数)

【例】

  1. import numpy as np
  2. x = np.arange(5) #默认为[0,5),间隔为1
  3. print(x) # [0 1 2 3 4]
  4. x = np.arange(3, 7, 2) #指定间隔
  5. print(x) # [3 5]
  6. x = np.linspace(start=0, stop=2, num=9) #指定间隔和数字数量n,输出等间隔的n个数
  7. print(x)
  8. # [0. 0.25 0.5 0.75 1. 1.25 1.5 1.75 2. ]
  9. x = np.logspace(0, 1, 5)
  10. print(np.around(x, 2))
  11. # [ 1. 1.78 3.16 5.62 10. ]
  12. #np.around 返回四舍五入后的值,可指定精度。
  13. # around(a, decimals=0, out=None)
  14. # a 输入数组
  15. # decimals 要舍入的小数位数。 默认值为0。 如果为负,整数将四舍五入到小数点左侧的位置
  16. x = np.linspace(start=0, stop=1, num=5)
  17. #logspace的同等意义
  18. x = [10 ** i for i in x]
  19. print(np.around(x, 2))
  20. # [ 1. 1.78 3.16 5.62 10. ]
  21. x = np.random.random(5)
  22. print(x)
  23. # [0.41768753 0.16315577 0.80167915 0.99690199 0.11812291]
  24. x = np.random.random([2, 3])
  25. print(x)
  26. # [[0.41151858 0.93785153 0.57031309]
  27. # [0.13482333 0.20583516 0.45429181]]

1.4.4利用数据结构来创建 ()

结构数组,先定义结构,后利用np.array()创建数组。参数dtype为定义的结构。

【利用字典定义结构】

【例】

  1. import numpy as np
  2. personType = np.dtype({
  3. 'names': ['name', 'age', 'weight'],
  4. 'formats': ['U30', 'i8', 'f8']})
  5. a = np.array([('Liming', 24, 63.9), ('Mike', 15, 67.), ('Jan', 34, 45.8)],
  6. dtype=personType)
  7. print(a, type(a))
  8. # [('Liming', 24, 63.9) ('Mike', 15, 67. ) ('Jan', 34, 45.8)]
  9. # <class 'numpy.ndarray'>

【利用包含多个元组的列表来定义结构】

【例】

  1. import numpy as np
  2. personType = np.dtype([('name', 'U30'), ('age', 'i8'), ('weight', 'f8')])
  3. a = np.array([('Liming', 24, 63.9), ('Mike', 15, 67.), ('Jan', 34, 45.8)],
  4. dtype=personType)
  5. print(a, type(a))
  6. # [('Liming', 24, 63.9) ('Mike', 15, 67. ) ('Jan', 34, 45.8)]
  7. # <class 'numpy.ndarray'>
  8. # 结构数组的取值方式和一般数组差不多,可以通过下标取得元素:
  9. print(a[0])
  10. # ('Liming', 24, 63.9)
  11. print(a[-2:])
  12. # [('Mike', 15, 67. ) ('Jan', 34, 45.8)]
  13. # 我们可以使用字段名作为下标获取对应的值
  14. print(a['name'])
  15. # ['Liming' 'Mike' 'Jan']
  16. print(a['age'])
  17. # [24 15 34]
  18. print(a['weight'])
  19. # [63.9 67. 45.8]

1.5数组的属性 

numpy.ndarray.ndim:返回数组的维数(轴的个数)也称为秩,一维数组的秩为 1,二维数组的秩为 2,以此类推。
numpy.ndarray.shape:数组的维度,返回一个元组代表维度。这个元组的长度就是维度的数目,即 ndim 属性(秩)。
numpy.ndarray.size:数组中所有元素的总量,相当于数组的shape中所有元素的乘积,例如矩阵的元素总量为行与列的乘积。
numpy.ndarray.dtype ndarray :对象的元素类型。
numpy.ndarray.itemsize:以字节的形式返回数组中每一个元素的大小。

【例】

  1. import numpy as np
  2. a = np.array([1, 2, 3, 4, 5])
  3. print(a.ndim) # 1
  4. print(a.shape) # (5,) 一维数组的维度
  5. print(a.dtype) # int32
  6. print(a.size) # 5
  7. print(a.itemsize) # 4
  8. b = np.array([[1, 2, 3], [4, 5, 6.0]])
  9. print(b.shape) # (2, 3) 分别为二维数组的两个维度
  10. print(b.dtype) # float64
  11. print(b.size) # 6
  12. print(b.ndim) # 2
  13. print(b.itemsize) # 8

ndarray中所有元素必须是同一类型,否则会自动向下转换int->float->str

【例】

  1. import numpy as np
  2. a = np.array([1, 2, 3, 4, 5])
  3. print(a) # [1 2 3 4 5]
  4. b = np.array([1, 2, 3, 4, '5'])
  5. print(b) # ['1' '2' '3' '4' '5']
  6. c = np.array([1, 2, 3, 4, 5.0])
  7. print(c) # [1. 2. 3. 4. 5.]
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/煮酒与君饮/article/detail/742243
推荐阅读
相关标签
  

闽ICP备14008679号