1.特点
2.面试题:数组和列表的区别
数组和列表结构相似,用法有些区别,比如数组存储的是相同类型的数据,执行速度较快。但是列表可以存储其他类型的数据,甚至可以嵌套字典列表等,因此处理的时候较慢,再加上python语言本身执行效率比编译型语言运行慢,所以列表比字典执行效率低。
属性 | 作用 |
---|---|
arr1.shape | 数组的维度 |
arr1.ndim | 数组的秩,也是求出的维度的长度 |
arr1.size | 数组元素的总个数 |
arr1.dtype | 数组的类型(int32,int64,float32等) |
arr3.itemsize | 每个元素的字节大小(字节byte--------位bit(8byte=1bit)) |
arr1.data | 缓冲区data |
举例:
import numpy as np
# ------------------------------------一维数组
a1 = np.array([1, 2, 3, 4, 5])
print('a1的维度:', a1.shape) # a1的维度: (5,)
print('a1的秩求法1:', a1.ndim) # a1的秩求法1: 1
print('a1的秩求法2:', len(a1.shape)) # a1的秩求法2: 1
print('a1的数组元素个数:', a1.size) # a1的数组元素个数: 5
print('a1的缓存区:', a1.data) # a1的缓存区:
print('a1的元素类型:', a1.dtype) # a1的元素类型: int32
print('a1的字节大小:', a1.itemsize) # a1的字节大小: 4
# ------------------------------------多维数组
a2 = np.array([(1, 2, 3), (4, 5, 6), (7, 8, 9)])
print('a2的维度:', a2.shape) # a2的维度: (3, 3)
print('a2的秩求法1:', a2.ndim) # a2的秩求法1: 2
print('a2的秩求法2:', len(a2.shape)) # a2的秩求法2: 2
print('a2的数组元素个数:', a2.size) # a2的数组元素个数: 9
print('a2的缓存区:', a2.data) # a2的缓存区:
print('a2的元素类型:', a2.dtype) # a2的元素类型: int32
print('a2的字节大小:', a2.itemsize) # a2的字节大小: 4
注意:numpy中的一维数组的shape理解
创建数组的函数 | 作用 |
---|---|
np.array() | 内部填充列表或元组,可一维数组可二维数组 |
np.arange() | 左闭右开,类似range函数,可以设置范围和步长 |
np.linspace() | 左闭右闭,等差数列数组,可以指定范围和个数 |
np.logspace() | 等比数列,指定范围和个数和公比 |
np.zeros() | 占位数组,用0占位,可以设置形状 |
np.ones() | 占位数组,用1占位,可以设置形状(2,3) ,一维数组直接写长度 |
np.empty() | 随机数组,可以设置形状(直接写行和列) ,一维数组直接写长度 |
np.eye() | 单位矩阵 |
np.diag() | 对角矩阵 |
# 不指定数组类型
print(np.array([1, 2, 3]))
print(np.array([[1, 2, 3], [4, 5, 6]]))
print(np.array([(1, 2, 3), (4, 5, 6)]))
'''
结果:
[1 2 3]
[[1 2 3]
[4 5 6]]
[[1 2 3]
[4 5 6]]
'''
#指定数据类型
print(np.array([1,2,3],dtype=np.float64)) # [ 1. 2. 3.]
通过指定开始值、终值和步长创建表示等差数列的一维数组,注意得到的结果数组不包含终值。
# 创建一个start开始,stop结尾,步长为step的数组
arange(start=None, stop=None, step=None, dtype=None)
参数说明:
import numpy as np
print(np.arange(3, 9)) # 默认步长为1 [3 4 5 6 7 8]
print(np.arange(1.1, 1.9, 0.1)) # [ 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8]
通过指定开始值、终值和元素个数创建表示等差数列的一维数组,可以通过endpoint参数指定是否包含终值,默认值为True,即包含终值。
linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
参数介绍:
import numpy as np
print(np.linspace(1, 10, 10))
# [ 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.]
#默认是小数
返回在对数刻度上均匀间隔的数字;即可以通过np.logspace方法创建等比数列数组。
logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None)
参数介绍:
arr6 = np.logspace(1, 3, 3) # 从1次开始到3次结束,数量3个,以十开始的等比数列
print(arr6) # [ 10. 100. 1000.]
arr7 = np.logspace(1, 3, 3, base=2)
print(arr7) # [ 2. 4. 8.]
zeros(shape, dtype=None, order='C')
ones(shape, dtype=None, order='C')
参数介绍:
# zeros()使用0进行占位的数组,ones用法相同
np.zeros((2, 3))
'''
[[ 0. 0. 0.]
[ 0. 0. 0.]]
'''
np.zeros(5)
'''
[ 0. 0. 0. 0. 0.]
'''
创建一个内容随机且依赖于内存状态的数组,根据给定的维度和数值类型返回一个新的数组,其元素不进行初始化。
empty(shape, dtype=None, order='C')
参数介绍:
np.empty((2, 3))
'''
结果:
[[ 2.47032823e-322 0.00000000e+000 0.00000000e+000]
[ 0.00000000e+000 0.00000000e+000 0.00000000e+000]]
'''
np.eye(3) # 生成3阶单位矩阵
'''
[[ 1. 0. 0.]
[ 0. 1. 0.]
[ 0. 0. 1.]]
'''
np.diag([1,2,3,4])
'''
结果:
[[1 0 0 0]
[0 2 0 0]
[0 0 3 0]
[0 0 0 4]]
'''
随机生成数组的函数 | 作用 |
---|---|
np.random.random(n) | 生成0,1范围的数组,n为元素个数,左闭右开 |
np.random.rand(m,n) | 生成0,1范围的数组,形状为m*n,左闭右开 |
np.random.randn(n) | 生成正太形式的随机数组,n为元素个数 |
np.random.randint(m,n,size) | 生成m,n范围的数组,形状为size(传入元组形式的shape) |
1.random.random(n)#[0,1),n为元素个数
import numpy as np
arr1 = np.random.random(3)
print(arr1)
arr2 = np.random.random(15).reshape((3, 5)) # 三行五列
print(arr2)
2.random.rand(m,n)-------生成m*n的数组,前闭后开[0,1)
print(np.random.rand(2,3))
3.random.randn(n)-------生成正太的随机数,n为数量
arr4 = np.random.randn(20000)
# 画图模块查看正太分布
import matplotlib.pyplot as plt
plt.hist(arr4)
plt.show()
4.random.randint()#左闭右闭
print(np.random.randint(2, 33, size=(2, 5)))# 从2,33,随机生成一个两行五列
函数 | 作用 | 区别 |
---|---|---|
array.shape=(2,3) | 将数组形状改为(2,3) | |
array.reshape((2,3)) | 将数组形状改为(2,3) | |
ravel(array) | 将多维数组改为一维数组 | 视图view:侧重的是数据的展现,而不是数据的本身–使用ravel返回的是一份视图,类似浅拷贝 |
flatten(array) | 将多维数组改为一维数组 | 拷贝copy:强调的是数据–使用flatten返回的是一份拷贝,类似深拷贝 |
hstack(arr1,arr2) | 将两个数组按行横向拼接 | |
vstack(arr1,arr2) | 将两个数组按列纵向拼接 | |
concatenate((arr1, arr2), axis=1) | 和hstack效果相同,将两个数组按行横向拼接 | |
concatenate((arr1, arr2), axis=0) | 和vstack效果相同,将两个数组按列纵向拼接 |
a1 = np.array([1, 2, 3, 4, 5, 6])
print(a1.shape)
a1.shape = (2, 3)
print(a1)
a2 = np.array([1, 2, 3, 4, 5, 6]).reshape((2, 3))
print(a2)
①ravel()
arr1 = np.arange(10000)
arr2 = arr1.reshape((100, 100))
arr3 = arr2.ravel()
print(arr1)
print(arr2)
print(arr3)
# 当numpy数据太大的时候,中间会用...省略,但是我们非要看中间的,需要设置
np.set_printoptions(threshold=np.NAN)
print(arr1)
arr1 = np.arange(10).reshape((2, 5))
arr2 = arr1.flatten()
arr3 = arr1.ravel()
print(arr1)
print(arr2)
print(arr3)
a1 = np.array([[1, 2], [3, 4]])
f_a = a1.flatten() #
r_a = a1.ravel()
print(a1)
print(f_a) # [1 2 3 4]
print(r_a) # [1 2 3 4]
a1[1][1] = 1111
print('--------------------类似深拷贝,自己或者原数组改变,不会影响对方----------')
f_a[2] = 100
print(f_a) # [ 1 2 100 4]
print(a1) # 不变
print('---------------------类似浅拷贝,自己或者原数组改变,会互相改变--------')
r_a[2] = 100
print(r_a) # [ 1 2 100 1111]
print(a1) # 变化
一维数组: hstack和vstack
arr1 = np.arange(1, 6, 2) # [1 3 5]
arr2 = np.arange(7, 12, 2) # [ 7 9 11]
arr3 = np.hstack((arr1, arr2)) # 横行拼接
arr4 = np.vstack((arr1, arr2)) # 纵向拼接
print(arr3)
print(arr4)
# 二维数组
arr1 = np.array([[1, 2, 3], [4, 5, 6]])
arr2 = np.array([[7, 8, 9], [10, 11, 12]])
arr3 = np.hstack((arr1, arr2)) # 横行拼接
arr4 = np.vstack((arr1, arr2)) # 纵向拼接
print(arr3)
print(arr4)
注意:
arr1 = np.array([[1, 1], [2, 2]])
arr2 = np.array([[3, 3], [4, 4]])
print(np.concatenate((arr1, arr2), axis=0)) # 和vstack效果相同
print(np.concatenate((arr1, arr2), axis=1)) # 和hstack效果相同
arr1 = np.arange(10)
print(arr1[3]) # 3
print(arr1[2:6]) # [2 3 4 5]
print(arr1[:2]) # [0 1]
print(arr1[::-1]) # [9 8 7 6 5 4 3 2 1 0]
arr1[2:4] = 111, 111
print(arr1)#[ 0 1 111 111 4 5 6 7 8 9]
arr2 = np.array([[1, 1, 1, 1], [2, 2, 2, 2], [3, 3, 3, 3]])
print(arr2)
# 拿出第一行的第三个和第四个数据
print(arr2[0][2:])
print(arr2[0, 2:])
arr3 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 取出1,3行的所有数据
print(arr3[(0, 2), :])
# 对于自定义类型的多维数组,可以采取键名拿数据
df = np.dtype([('name', np.str_, 40), ('numitems', np.int64), ('price', np.float64)])
print('df数据结构为:', df) # [('name', '
table1 = np.array([('apple', 12, 1.32), ('banana', 22, 3.26)], dtype=df)
print(table1['name'])
arr3 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
mask = np.array([True, False, True])
print(arr3[mask, 2])
#true为显示,false不显示,1,3行显示,然后列为2的,所以结果为:[3,9]
类型 | 描述 |
---|---|
bool_ | 布尔型数据类型(True 或者 False) |
int_ | 默认的整数类型(类似于 C 语言中的 long,int32 或 int64) |
intc | 与 C 的 int 类型一样,一般是 int32 或 int 64 |
intp | 用于索引的整数类型(类似于 C 的 ssize_t,一般情况下仍然是 int32 或 int64) |
int8 | 字节(-128 to 127) |
int16 | 整数(-32768 to 32767) |
int32 | 整数(-2147483648 to 2147483647) |
int64 | 整数(-9223372036854775808 to 9223372036854775807) |
uint8 | 无符号整数(0 to 255) |
uint16 | 无符号整数(0 to 65535) |
uint32 | 无符号整数(0 to 4294967295) |
uint64 | 无符号整数(0 to 18446744073709551615) |
float_ | float64 类型的简写 |
float16 | 半精度浮点数,包括:1 个符号位,5 个指数位,10 个尾数位 |
float32 | 单精度浮点数,包括:1 个符号位,8 个指数位,23 个尾数位 |
float64 | 双精度浮点数,包括:1 个符号位,11 个指数位,52 个尾数位 |
complex_ | complex128 类型的简写,即 128 位复数 |
complex64 | 复数,表示双 32 位浮点数(实数部分和虚数部分) |
complex128 | 复数,表示双 64 位浮点数(实数部分和虚数部分) |
自定义数据类型:
# 创建一个存储餐饮企业库存信息的数据类型
# (1)用一个长度为40的字符串来记录商品的名称
# (2)用一个长度64的整数来记录商品库存
# (3)用一个64为单精度浮点数来记录商品的价格
df = np.dtype([('name', np.str_, 40), ('numitems', np.int64), ('price', np.float64)])
print('df数据结构为:', df)
table1 = np.array([('apple', 12, 1.32), ('banana', 22, 3.26)], dtype=df)
print(table1)
print(table1['name'])