数据分析是指用适当的统计分析方法对收集来的大量数据进行分析,提取有用信息和形成结论而对数据加以详细研究和概括总结的过程。
用np.ndarray类的对象表示n维数组
import numpy as np
ary = np.array([1, 2, 3, 4, 5, 6])
print(type(ary))
#
元数据(metadata)
存储对目标数组的描述信息,如:dim count、dimensions、dtype、data等。
实际数据
完整的数组数据
将实际数据与元数据分开存放,一方面提高了内存空间的使用效率,另一方面减少对实际数据的访问频率,提高性能。
np.array(任何可被解释为Numpy数组的逻辑结构)
import numpy as np
a = np.array([1, 2, 3, 4, 5, 6])
print(a) # [1 2 3 4 5 6]
np.arange(起始值(0),终止值,步长(1))
import numpy as np
a = np.arange(0, 5, 1)
print(a)
b = np.arange(0, 10, 2)
print(b)
# [0 1 2 3 4]
# [0 2 4 6 8]
np.zeros(数组元素个数, dtype=‘类型’)
import numpy as np
a = np.zeros(10)
print(a)
# [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
np.ones(数组元素个数, dtype=‘类型’)
import numpy as np
a = np.ones(10)
print(a)
# [1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
数组的维度: np.ndarray.shape
import numpy as np
ary = np.array([1, 2, 3, 4, 5, 6])
print(type(ary), ary, ary.shape)
#二维数组
ary = np.array([
[1,2,3,4],
[5,6,7,8]
])
print(type(ary), ary, ary.shape)
# [1 2 3 4 5 6] (6,)
# [[1 2 3 4]
# [5 6 7 8]] (2, 4)
元素的类型: np.ndarray.dtype
import numpy as np
ary = np.array([1, 2, 3, 4, 5, 6])
print(type(ary), ary, ary.dtype)
#转换ary元素的类型
b = ary.astype(float)
print(type(b), b, b.dtype)
#转换ary元素的类型
c = ary.astype(str)
print(type(c), c, c.dtype)
# [1 2 3 4 5 6] int32
# [1. 2. 3. 4. 5. 6.] float64
# ['1' '2' '3' '4' '5' '6']
数组元素的个数: np.ndarray.size
import numpy as np
ary = np.array([
[1,2,3,4],
[5,6,7,8]
])
#观察维度,size,len的区别
print(ary.shape, ary.size, len(ary)) # (2, 4) 8 2
数组元素索引(下标)
数组对象[…, 页号, 行号, 列号]
下标从0开始,到数组len-1结束。
import numpy as np
a = np.array([[[1, 2],
[3, 4]],
[[5, 6],
[7, 8]]])
print(a, a.shape)
#[[[1 2]
# [3 4]]
# [[5 6]
# [7 8]]] (2, 2, 2)
print(a[0])
#[[1 2]
# [3 4]]
print(a[0][0]) # [1 2]
print(a[0][0][0]) # 1
print(a[0, 0, 0]) # 1
for i in range(a.shape[0]):
for j in range(a.shape[1]):
for k in range(a.shape[2]):
print(a[i, j, k])
# 1
# 2
# 3
# 4
# 5
# 6
# 7
# 8
Numpy的内部基本数据类型
类型名 | 类型表示符 |
---|---|
布尔型 | bool_ |
有符号整数型 | int8(-128~127)/int16/int32/int64 |
无符号整数型 | uint8(0~255)/uint16/uint32/uint64 |
浮点型 | float16/float32/float64 |
复数型 | complex64/complex128 |
字串型 | str_,每个字符用32位Unicode编码表示 |
自定义复合类型
# 自定义复合类型
import numpy as np
data=[
('zs', [90, 80, 85], 15),
('ls', [92, 81, 83], 16),
('ww', [95, 85, 95], 15)
]
#第一种设置dtype的方式
a = np.array(data, dtype='U3, 3int32, int32')
print(a)
print(a[0]['f0'], ":", a[1]['f1'])
# [('zs', [90, 80, 85], 15) ('ls', [92, 81, 83], 16)('ww', [95, 85, 95], 15)]
# zs : [92 81 83]
#第二种设置dtype的方式
b = np.array(data, dtype=[('name', 'str_', 2),
('scores', 'int32', 3),
('ages', 'int32', 1)])
print(b[0]['name'], ":", b[0]['scores']) #zs : [90 80 85]
#第三种设置dtype的方式
c = np.array(data, dtype={'names': ['name', 'scores', 'ages'], 'formats': ['U3', '3int32', 'int32']})
print(c[0]['name'], ":", c[0]['scores'], ":", c.itemsize)
# zs : [90 80 85] : 28
#第四种设置dtype的方式
d = np.array(data, dtype={'name': ('U3', 0),
'scores': ('3i4', 16),
'age': ('i4', 28)})
print(d[0]['name'], d[0]['scores'], d.itemsize)
# zs [90 80 85] 32
#第五种设置dtype的方式
e = np.array([0x1234, 0x5667],
dtype=('u2', {'lowc': ('u1', 0),
'hignc': ('u1', 1)}))
print('%x' % e[0])
print('%x %x' % (e['lowc'][0], e['hignc'][0]))
# 1234
# 34 12
a = np.array([[1 + 1j, 2 + 4j, 3 + 7j],
[4 + 2j, 5 + 5j, 6 + 8j],
[7 + 3j, 8 + 6j, 9 + 9j]])
print(a.T)
#[[1.+1.j 4.+2.j 7.+3.j]
# [2.+4.j 5.+5.j 8.+6.j]
# [3.+7.j 6.+8.j 9.+9.j]]
for x in a.flat:
print(x.imag)
# 1.0
# 4.0
# 7.0
# 2.0
# 5.0
# 8.0
# 3.0
# 6.0
# 9.0
f = np.array(['2011', '2012-01-01', '2013-01-01 01:01:01','2011-02-01'])
f = f.astype('M8[D]')
print(f) # ['2011-01-01' '2012-01-01' '2013-01-01' '2011-02-01']
f = f.astype('int32')
print(f) # [14975 15340 15706 15006]
print(f[3] - f[0]) # 31
类型 | 字符码 |
---|---|
np.bool_ | ? |
np.int8/16/32/64 | i1/i2/i4/i8 |
np.uint8/16/32/64 | u1/u2/u4/u8 |
np.float/16/32/64 | f2/f4/f8 |
np.complex64/128 | c8/c16 |
np.str_ | U<字符数> |
np.datetime64 | M8[Y] M8[M] M8[D] M8[h] M8[m] M8[s] |
字节序前缀,用于多字节整数和字符串:
>/[=]分别表示小端/大端/硬件字节序。
类型字符码格式
<字节序前缀><维度><类型><字节数或字符数>
3i4 | 释义 |
---|---|
3i4 | 大端字节序,3个元素的一维数组,每个元素都是整型,每个整型元素占4个字节。 |
<(2,3)u8 | 小端字节序,6个元素2行3列的二维数组,每个元素都是无符号整型,每个无符号整型元素占8个字节。 |
U7 | 包含7个字符的Unicode字符串,每个字符占4个字节,采用默认字节序。 |
视图变维(数据共享): reshape() 与 ravel()
调用这两个方法得到的数组跟原数组使用的数据是同一份,b数组中具体元素值改变,a数组也跟着改变,反之也成立,a数组的维度是不变的。
import numpy as np
a = np.arange(1, 9)
print(a) # [1 2 3 4 5 6 7 8]
b = a.reshape(2, 4) #视图变维 : 变为2行4列的二维数组
print(b)
#[[1 2 3 4]
# [5 6 7 8]]
c = b.reshape(2, 2, 2) #视图变维 变为2页2行2列的三维数组
print(c)
#[[[1 2]
# [3 4]]
#
# [[5 6]
# [7 8]]]
d = c.ravel() #视图变维 变为1维数组
print(d) # [1 2 3 4 5 6 7 8]
复制变维(数据独立): flatten()
e = c.flatten()
print(e) # [1 2 3 4 5 6 7 8]
a += 10
print(a, e, sep='\n')
# [11 12 13 14 15 16 17 18]
# [1 2 3 4 5 6 7 8]
就地变维:直接改变原数组对象的维度,不返回新数组
a.shape = (2, 4)
print(a)
a.resize(2, 2, 2)
print(a) #
#[[11 12 13 14]
# [15 16 17 18]]
#[[[11 12]
# [13 14]]
#
# [[15 16]
# [17 18]]]
数组对象切片的参数设置与列表切面参数类似
步长+:默认切从首到尾
步长-:默认切从尾到首
数组对象[起始位置:终止位置:步长, ...]
默认位置步长:1
import numpy as np
a = np.arange(1, 10)
print(a) # 1 2 3 4 5 6 7 8 9
print(a[:3]) # 1 2 3
print(a[3:6]) # 4 5 6
print(a[6:]) # 7 8 9
print(a[::-1]) # 9 8 7 6 5 4 3 2 1
print(a[:-4:-1]) # 9 8 7
print(a[-4:-7:-1]) # 6 5 4
print(a[-7::-1]) # 3 2 1
print(a[::]) # 1 2 3 4 5 6 7 8 9
print(a[:]) # 1 2 3 4 5 6 7 8 9
print(a[::3]) # 1 4 7
print(a[1::3]) # 2 5 8
print(a[2::3]) # 3 6 9
多维数组的切片操作
import numpy as np
a = np.arange(1, 28)
a.resize(3,3,3)
print(a)
#[[[ 1 2 3]
# [ 4 5 6]
# [ 7 8 9]]
#
# [[10 11 12]
# [13 14 15]
# [16 17 18]]
#
# [[19 20 21]
# [22 23 24]
# [25 26 27]]]'''
#切出1页
print(a[1, :, :])
#[[10 11 12]
# [13 14 15]
# [16 17 18]]
#切出所有页的1行
print(a[:, 1, :])
#[[ 4 5 6]
# [13 14 15]
# [22 23 24]]
#切出0页的1列
print(a[0, :, 1]) # [2 5 8]
import numpy as np
a = np.arange(0, 10)
mask = [True, False,True, False,True, False,True, False,True, False]
print(a[mask]) # [0 2 4 6 8]
#输出100以内3的倍数
a = np.arange(1, 100)
mask = a % 3 == 0
print(a[mask])
# [ 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99]
#输出100以内同时是3和7的倍数
a = np.arange(1, 100)
mask = (a % 3 == 0) & (a % 7 == 0)
print(a[mask]) # [21 42 63 84]
#基于索引的掩码
names = np.array(['A', 'B', 'C', 'D', 'E'])
rank = [1, 0, 3, 4, 2]
print(names[rank]) # ['B' 'A' 'D' 'E' 'C']
垂直方向操作:
import numpy as np
a = np.arange(1, 7).reshape(2, 3)
b = np.arange(7, 13).reshape(2, 3)
# 垂直方向完成组合操作,生成新数组
c = np.vstack((a, b))
#[[ 1 2 3]
# [ 4 5 6]
# [ 7 8 9]
# [10 11 12]]
# 垂直方向完成拆分操作,生成两个数组
d, e = np.vsplit(c, 2)
#[[1 2 3]
# [4 5 6]]
#[[ 7 8 9]
# [10 11 12]]
水平方向操作:
import numpy as np
a = np.arange(1, 7).reshape(2, 3)
b = np.arange(7, 13).reshape(2, 3)
# 水平方向完成组合操作,生成新数组
c = np.hstack((a, b))
#[[ 1 2 3 7 8 9]
# [ 4 5 6 10 11 12]]
# 水平方向完成拆分操作,生成两个数组
d, e = np.hsplit(c, 2)
#[[1 2 3]
# [4 5 6]]
#[[ 7 8 9]
# [10 11 12]]
深度方向操作:(3维)
import numpy as np
a = np.arange(1, 7).reshape(2, 3)
b = np.arange(7, 13).reshape(2, 3)
# 深度方向(3维)完成组合操作,生成新数组
i = np.dstack((a, b))
#[[[ 1 7]
# [ 2 8]
# [ 3 9]]
#
# [[ 4 10]
# [ 5 11]
# [ 6 12]]]
# 深度方向(3维)完成拆分操作,生成两个数组
k, l = np.dsplit(i, 2)
print(k)
#[[[1]
# [2]
# [3]]
#
# [[4]
# [5]
# [6]]]
print(l)
#[[[ 7]
# [ 8]
# [ 9]]
#
# [[10]
# [11]
# [12]]]
多维数组组合与拆分的相关函数:
通过axis作为关键字参数指定组合的方向,取值如下:
若待组合的数组都是二维数组:
0: 垂直方向组合
1: 水平方向组合
若待组合的数组都是三维数组:
0: 垂直方向组合
1: 水平方向组合
2: 深度方向组合
np.concatenate((a, b), axis=0)
#array([[ 1, 2, 3],
# [ 4, 5, 6],
# [ 7, 8, 9],
# [10, 11, 12]])
# 通过给出的数组与要拆分的份数,按照某个方向进行拆分,axis的取值同上
np.split(c, 2, axis=0)
#[array([[1, 2, 3],
# [4, 5, 6]]),
# array([[ 7, 8, 9],
# [10, 11, 12]])]
长度不等的数组组合:
import numpy as np
a = np.array([1,2,3,4,5])
b = np.array([1,2,3,4])
# 填充b数组使其长度与a相同,头部添加0个元素,尾部添加1个元素
b = np.pad(b, pad_width = (0, 1), mode = 'constant', constant_values = -1)
print(b) # [ 1 2 3 4 -1]
# 垂直方向完成组合操作,生成新数组
c = np.vstack((a, b))
print(c)
# [[ 1 2 3 4 5]
# [ 1 2 3 4 -1]]
简单的一维数组组合方案
a = np.arange(1,9) # [1, 2, 3, 4, 5, 6, 7, 8]
b = np.arange(9,17) # [9,10,11,12,13,14,15,16]
#注意!下面两个方法传参时传的是元组
#把两个数组摞在一起成两行
c = np.row_stack((a, b))
print(c)
#[[ 1 2 3 4 5 6 7 8]
# [ 9 10 11 12 13 14 15 16]]
#把两个数组组合在一起成两列
d = np.column_stack((a, b))
print(d)
#[[ 1 9]
# [ 2 10]
# [ 3 11]
# [ 4 12]
# [ 5 13]
# [ 6 14]
# [ 7 15]
# [ 8 16]]
import numpy as np
a = np.array([[1 + 1j, 2 + 4j, 3 + 7j],
[4 + 2j, 5 + 5j, 6 + 8j],
[7 + 3j, 8 + 6j, 9 + 9j]])
print(a.shape) # (3, 3)
print(a.dtype) # complex128
print(a.ndim) # 2
print(a.size) # 9
print(a.itemsize) # 16
print(a.nbytes) # 144
print(a.real, a.imag, sep='\n') # 实部和虚部
#[[1. 2. 3.]
# [4. 5. 6.]
# [7. 8. 9.]]
#[[1. 4. 7.]
# [2. 5. 8.]
# [3. 6. 9.]]
print(a.T)
#[[1.+1.j 4.+2.j 7.+3.j]
# [2.+4.j 5.+5.j 8.+6.j]
# [3.+7.j 6.+8.j 9.+9.j]]
print([elem for elem in a.flat])
# [(1+1j), (2+4j), (3+7j), (4+2j), (5+5j), (6+8j), (7+3j), (8+6j), (9+9j)]
b = a.tolist()
print(b)
# [[(1+1j), (2+4j), (3+7j)], [(4+2j), (5+5j), (6+8j)], [(7+3j), (8+6j), (9+9j)]]